

#Область ОписаниеПеременных

#КонецОбласти

#Область ОбработчикиСобытийФормы

// Обработчик события формы ПриСозданииНаСервере.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Перем ВременныйУзел;

	НачальныйЗаголовок = Заголовок;
	ИнициализироватьДеревоОтчетов(ДеревоОтчетов);
	НастройкиКонсоли = ХранилищеОбщихНастроек.Загрузить("НастройкиКонсолиСистемыОтчетности5");

	Если НастройкиКонсоли <> Неопределено Тогда

		НастройкиКонсоли.Свойство("ИмяФайла", ИмяФайла);
		НастройкиКонсоли.Свойство("ТекущийУзел", ВременныйУзел);

		Если ТипЗнч(ВременныйУзел) = Тип("СписокЗначений") Тогда

			ТекущийУзел = ВременныйУзел;

		КонецЕсли;

	КонецЕсли;

	ИмяФормыРасшифровки = "Отчет.УИ_КонсольОтчетов.Форма.ФормаРасшифровки";

	Элементы.Настройки.Пометка = Истина;
	Элементы.ПанельРезультатовКнопка.Пометка = Истина;

	Если Параметры.Свойство("ДанныеОтладки") Тогда
		ЗаполнитьСКДДляОтладки(Параметры.ДанныеОтладки);
		Возврат;
	КонецЕсли;
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка, Элементы.ГлавнаяКоманднаяПанель);

КонецПроцедуры

// Обработка события Выбор. Вызывается из конструктора схемы компоновки данных.
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

	Модифицированность = Истина;
	УстановитьСхемуКомпоновкиДанныхКлиент(ВыбранноеЗначение);
КонецПроцедуры

// Обработка события ПередЗакрытием.
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ЗавершениеРаботы<>Истина И Модифицированность Тогда
		Отказ = Истина;
		ПодтвердитьЗакрытие(Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтаФорма));
	КонецЕсли;

КонецПроцедуры

// Завершение обработки закрытия.
&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат Тогда
		Модифицированность = Ложь;
		Закрыть();
	КонецЕсли;
КонецПроцедуры

// Обработчик события ПриЗакрытии.
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)

	Если ЗавершениеРаботы <> Истина Тогда 
		СохранитьНастройкиКонсоли();
	КонецЕсли;
	
КонецПроцедуры

// Обработчик события ПриОткрытии.
&НаКлиенте
Процедура ПриОткрытии(Отказ)

	Если ИмяФайла <> "" Тогда

		ЗагружаемоеИмяФайла = ИмяФайла;
		ИмяФайла = "";
		Попытка
			ЗагрузитьФайлКонсоли(ЗагружаемоеИмяФайла);
		Исключение
			УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка загрузки отчетов из файла");
		КонецПопытки;
	КонецЕсли;

КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

// Обработчик события ПриАктивизацииПоля таблицы Структура.
// Активизирует страницу настроек в зависимости от того, какую колонку
// активировал пользователь.
&НаКлиенте
Процедура СтруктураПриАктивизацииПоля(Элемент)

	Перем ВыбраннаяСтраница;

	Если Элементы.Структура.ТекущийЭлемент.Имя = "СтруктураНаличиеВыбора" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПолейВыбора;

	ИначеЕсли Элементы.Структура.ТекущийЭлемент.Имя = "СтруктураНаличиеОтбора" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаОтбора;

	ИначеЕсли Элементы.Структура.ТекущийЭлемент.Имя = "СтруктураНаличиеПорядка" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПорядка;

	ИначеЕсли Элементы.Структура.ТекущийЭлемент.Имя = "СтруктураНаличиеУсловногоОформления" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаУсловногоОформления;

	ИначеЕсли Элементы.Структура.ТекущийЭлемент.Имя = "СтруктураНаличиеПараметровВывода" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПараметровВывода;

	КонецЕсли;

	Если ВыбраннаяСтраница <> Неопределено Тогда

		Элементы.СтраницыНастроек.ТекущаяСтраница = ВыбраннаяСтраница;

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриАктивизацииПоля таблицы Структура1.
// Активизирует страницу настроек в зависимости от того, какую колонку
// активировал пользователь.
&НаКлиенте
Процедура СтруктураПриАктивизацииПоля1(Элемент)

	Перем ВыбраннаяСтраница;

	Если Элементы.Структура1.ТекущийЭлемент.Имя = "Структура1НаличиеВыбора" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПолейВыбора1;

	ИначеЕсли Элементы.Структура1.ТекущийЭлемент.Имя = "Структура1НаличиеОтбора" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаОтбора1;

	ИначеЕсли Элементы.Структура1.ТекущийЭлемент.Имя = "Структура1НаличиеПорядка" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПорядка1;

	ИначеЕсли Элементы.Структура1.ТекущийЭлемент.Имя = "Структура1НаличиеУсловногоОформления" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаУсловногоОформления1;

	ИначеЕсли Элементы.Структура1.ТекущийЭлемент.Имя = "Структура1НаличиеПараметровВывода" Тогда

		ВыбраннаяСтраница = Элементы.СтраницаПараметровВывода1;

	КонецЕсли;

	Если ВыбраннаяСтраница <> Неопределено Тогда

		Элементы.СтраницыНастроек1.ТекущаяСтраница = ВыбраннаяСтраница;

	КонецЕсли;

КонецПроцедуры

// Обработчик СтруктураПриАктивизацииСтроки элемента Структура.
// Приводит закладки с настройками в актуальное состояние
&НаКлиенте
Процедура СтруктураПриАктивизацииСтроки(Элемент)
	ТекСтрокаДерева = Элементы.Структура.ТекущаяСтрока;
	Если ТекСтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(ТекСтрокаДерева);
	ТипЭлемента = ТипЗнч(ЭлементСтруктуры);

	Если ТипЭлемента = Неопределено Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных")
		Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны();
		ВыбранныеПоляНедоступны();
		ОтборНедоступен();
		ПорядокНедоступен();
		УсловноеОформлениеНедоступно();
		ПараметрыВыводаНедоступны();

	ИначеЕсли ТипЭлемента = Тип("НастройкиКомпоновкиДанных") Или ТипЭлемента = Тип(
		"НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны();

		ЛокальныеВыбранныеПоля = Истина;
		Элементы.ЛокальныеВыбранныеПоля.ТолькоПросмотр = Истина;
		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей;

		ЛокальныйОтбор = Истина;
		Элементы.ЛокальныйОтбор.ТолькоПросмотр = Истина;
		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.НастройкиОтбора;

		ЛокальныйПорядок = Истина;
		Элементы.ЛокальныйПорядок.ТолькоПросмотр = Истина;
		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.НастройкиПорядка;

		ЛокальноеУсловноеОформление = Истина;
		Элементы.ЛокальноеУсловноеОформление.ТолькоПросмотр = Истина;
		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления;

		ЛокальныеПараметрыВывода = Истина;
		Элементы.ЛокальныеПараметрыВывода.ТолькоПросмотр = Истина;
		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.НастройкиПараметровВывода;

	ИначеЕсли ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных") Или ТипЭлемента = Тип(
		"ГруппировкаТаблицыКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда

		Элементы.СтраницыПолейГруппировки.ТекущаяСтраница = Элементы.НастройкиПолейГруппировки;

		ВыбранныеПоляДоступны(ЭлементСтруктуры);
		ОтборДоступен(ЭлементСтруктуры);
		ПорядокДоступен(ЭлементСтруктуры);
		УсловноеОформлениеДоступно(ЭлементСтруктуры);
		ПараметрыВыводаДоступны(ЭлементСтруктуры);

	ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Или ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны();
		ВыбранныеПоляДоступны(ЭлементСтруктуры);
		ОтборНедоступен();
		ПорядокНедоступен();
		УсловноеОформлениеДоступно(ЭлементСтруктуры);
		ПараметрыВыводаДоступны(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик СтруктураПриАктивизацииСтроки элемента Структура1.
// Приводит закладки с настройками в актуальное состояние
&НаКлиенте
Процедура СтруктураПриАктивизацииСтроки1(Элемент)

	ЭлементСтруктуры = ИсполняемыйКомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
		Элементы.Структура1.ТекущаяСтрока);
	ТипЭлемента = ТипЗнч(ЭлементСтруктуры);

	Если ТипЭлемента = Неопределено Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных")
		Или ТипЭлемента = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны1();
		ВыбранныеПоляНедоступны1();
		ОтборНедоступен1();
		ПорядокНедоступен1();
		УсловноеОформлениеНедоступно1();
		ПараметрыВыводаНедоступны1();

	ИначеЕсли ТипЭлемента = Тип("НастройкиКомпоновкиДанных") Или ТипЭлемента = Тип(
		"НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны1();

		ЛокальныеВыбранныеПоля1 = Истина;
		Элементы.ЛокальныеВыбранныеПоля1.ТолькоПросмотр = Истина;
		Элементы.СтраницыПолейВыбора1.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей1;

		ЛокальныйОтбор1 = Истина;
		Элементы.ЛокальныйОтбор1.ТолькоПросмотр = Истина;
		Элементы.СтраницыОтбора1.ТекущаяСтраница = Элементы.НастройкиОтбора1;

		ЛокальныйПорядок1 = Истина;
		Элементы.ЛокальныйПорядок1.ТолькоПросмотр = Истина;
		Элементы.СтраницыПорядка1.ТекущаяСтраница = Элементы.НастройкиПорядка1;

		ЛокальноеУсловноеОформление1 = Истина;
		Элементы.ЛокальноеУсловноеОформление1.ТолькоПросмотр = Истина;
		Элементы.СтраницыУсловногоОформления1.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления1;

		ЛокальныеПараметрыВывода1 = Истина;
		Элементы.ЛокальныеПараметрыВывода1.ТолькоПросмотр = Истина;
		Элементы.СтраницыПараметровВывода1.ТекущаяСтраница = Элементы.НастройкиПараметровВывода1;

	ИначеЕсли ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных") Или ТипЭлемента = Тип(
		"ГруппировкаТаблицыКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда

		Элементы.СтраницыПолейГруппировки1.ТекущаяСтраница = Элементы.НастройкиПолейГруппировки1;

		ВыбранныеПоляДоступны1(ЭлементСтруктуры);
		ОтборДоступен1(ЭлементСтруктуры);
		ПорядокДоступен1(ЭлементСтруктуры);
		УсловноеОформлениеДоступно1(ЭлементСтруктуры);
		ПараметрыВыводаДоступны1(ЭлементСтруктуры);

	ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Или ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда

		ПоляГруппировкиНедоступны1();
		ВыбранныеПоляДоступны1(ЭлементСтруктуры);
		ОтборНедоступен1();
		ПорядокНедоступен1();
		УсловноеОформлениеДоступно1(ЭлементСтруктуры);
		ПараметрыВыводаДоступны1(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события Нажатие декораций.
&НаКлиенте
Процедура ПерейтиКОтчету(Элемент)

	ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
		Элементы.Структура.ТекущаяСтрока);
	НастройкиЭлемента = Отчет.КомпоновщикНастроек.Настройки.НастройкиЭлемента(ЭлементСтруктуры);
	Элементы.Структура.ТекущаяСтрока = Отчет.КомпоновщикНастроек.Настройки.ПолучитьИдентификаторПоОбъекту(
		НастройкиЭлемента);

КонецПроцедуры

// Обработчик события Нажатие декораций для исполняемых настроек.
&НаКлиенте
Процедура ПерейтиКОтчету1(Элемент)

	ЭлементСтруктуры = ИсполняемыйКомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
		Элементы.Структура1.ТекущаяСтрока);
	НастройкиЭлемента = ИсполняемыйКомпоновщикНастроек.Настройки.НастройкиЭлемента(ЭлементСтруктуры);
	Элементы.Структура1.ТекущаяСтрока = ИсполняемыйКомпоновщикНастроек.Настройки.ПолучитьИдентификаторПоОбъекту(
		НастройкиЭлемента);

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальныеВыбранныеПоля.
&НаКлиенте
Процедура ЛокальныеВыбранныеПоляПриИзменении(Элемент)

	Если ЛокальныеВыбранныеПоля Тогда

		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей;

	Иначе

		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.ОтключенныеНастройкиВыбранныхПолей;

		ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура.ТекущаяСтрока);
		Отчет.КомпоновщикНастроек.Настройки.ОчиститьВыборЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальныеВыбранныеПоля1.
&НаКлиенте
Процедура ЛокальныеВыбранныеПоляПриИзменении1(Элемент)

	Если ЛокальныеВыбранныеПоля1 Тогда

		Элементы.СтраницыПолейВыбора1.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей1;

	Иначе

		Элементы.СтраницыПолейВыбора1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиВыбранныхПолей1;

		ЭлементСтруктуры = ИсполняемыйКомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура1.ТекущаяСтрока);
		ИсполняемыйКомпоновщикНастроек.Настройки.ОчиститьВыборЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальныйОтбор.
&НаКлиенте
Процедура ЛокальныйОтборПриИзменении(Элемент)

	Если ЛокальныйОтбор Тогда

		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.НастройкиОтбора;

	Иначе

		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.ОтключенныеНастройкиОтбора;

		ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура.ТекущаяСтрока);
		Отчет.КомпоновщикНастроек.Настройки.ОчиститьОтборЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальныйОтбор1.
&НаКлиенте
Процедура ЛокальныйОтборПриИзменении1(Элемент)

	Если ЛокальныйОтбор1 Тогда

		Элементы.СтраницыОтбора1.ТекущаяСтраница = Элементы.НастройкиОтбора1;

	Иначе

		Элементы.СтраницыОтбора1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиОтбора1;

		ЭлементСтруктуры = ИсполняемыйКомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура1.ТекущаяСтрока);
		ИсполняемыйКомпоновщикНастроек.Настройки.ОчиститьОтборЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальныйПорядок.
&НаКлиенте
Процедура ЛокальныйПорядокПриИзменении(Элемент)

	Если ЛокальныйПорядок Тогда

		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.НастройкиПорядка;

	Иначе

		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПорядка;

		ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура.ТекущаяСтрока);
		Отчет.КомпоновщикНастроек.Настройки.ОчиститьПорядокЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальныйПорядок1.
&НаКлиенте
Процедура ЛокальныйПорядокПриИзменении1(Элемент)

	Если ЛокальныйПорядок1 Тогда

		Элементы.СтраницыПорядка1.ТекущаяСтраница = Элементы.НастройкиПорядка1;

	Иначе

		Элементы.СтраницыПорядка1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПорядка1;

		ЭлементСтруктуры = ИсполняемыйКомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура1.ТекущаяСтрока);
		ИсполняемыйКомпоновщикНастроек.Настройки.ОчиститьПорядокЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальноеУсловноеОформление.
&НаКлиенте
Процедура ЛокальноеУсловноеОформлениеПриИзменении(Элемент)

	Если ЛокальноеУсловноеОформление Тогда

		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления;

	Иначе

		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.ОтключенныеНастройкиУсловногоОформления;

		ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура.ТекущаяСтрока);
		Отчет.КомпоновщикНастроек.Настройки.ОчиститьУсловноеОформлениеЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальноеУсловноеОформление1.
&НаКлиенте
Процедура ЛокальноеУсловноеОформлениеПриИзменении1(Элемент)

	Если ЛокальноеУсловноеОформление1 Тогда

		Элементы.СтраницыУсловногоОформления1.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления1;

	Иначе

		Элементы.СтраницыУсловногоОформления1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиУсловногоОформления1;

		ЭлементСтруктуры = ИсполняемыйКомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура1.ТекущаяСтрока);
		ИсполняемыйКомпоновщикНастроек.Настройки.ОчиститьУсловноеОформлениеЭлемента(ЭлементСтруктуры);

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальныеПараметрыВывода.
&НаКлиенте
Процедура ЛокальныеПараметрыВыводаПриИзменении(Элемент)

	Если ЛокальныеПараметрыВывода Тогда

		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.НастройкиПараметровВывода;

	Иначе

		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПараметровВывода;

		ЭлементСтруктуры = Отчет.КомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура.ТекущаяСтрока);
		Отчет.КомпоновщикНастроек.Настройки.ОчиститьПараметрыВыводаЭлемента(ЭлементСтруктуры);
	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриИзменении флажка ЛокальныеПараметрыВывода1.
&НаКлиенте
Процедура ЛокальныеПараметрыВыводаПриИзменении1(Элемент)

	Если ЛокальныеПараметрыВывода1 Тогда

		Элементы.СтраницыПараметровВывода1.ТекущаяСтраница = Элементы.НастройкиПараметровВывода1;

	Иначе

		Элементы.СтраницыПараметровВывода1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПараметровВывода1;

		ЭлементСтруктуры = ИсполняемыйКомпоновщикНастроек.Настройки.ПолучитьОбъектПоИдентификатору(
			Элементы.Структура1.ТекущаяСтрока);
		ИсполняемыйКомпоновщикНастроек.Настройки.ОчиститьПараметрыВыводаЭлемента(ЭлементСтруктуры);
	КонецЕсли;

КонецПроцедуры

// Обработчик события ПриАктивизацииСтроки элемента ДеревоОтчетов.
// Отображает соответствующую закладку - схему, вариант, пользовательские настройки и т.п.
&НаКлиенте
Процедура ДеревоОтчетовПриАктивизацииСтроки(Элемент)

	Если Не ИдетАктивацияСтроки И ТекущаяСтрока <> Элемент.ТекущаяСтрока Тогда

		ИдетАктивацияСтроки = Истина;

		Если Элемент.ТекущаяСтрока <> Неопределено Тогда

			ЭлементДерева = ДеревоОтчетов.НайтиПоИдентификатору(Элемент.ТекущаяСтрока);

			Если ЭлементДерева.ТипСтроки = 0 Тогда
			// Схема компоновки данных.
				Если Элементы.ГруппаНастроек.ТекущаяСтраница <> Элементы.ГруппаВарианта Тогда

					Элементы.ГруппаНастроек.ТекущаяСтраница = Элементы.ГруппаВарианта;

				КонецЕсли;
				//				
				//			ИначеЕсли ЭлементДерева.ТипСтроки = 1 Тогда
				//				// Вариант отчета.
				//				Если Элементы.ГруппаНастроек.ТекущаяСтраница <> Элементы.ГруппаВарианта Тогда
				//					
				//					Элементы.ГруппаНастроек.ТекущаяСтраница = Элементы.ГруппаВарианта;
				//					
				//				КонецЕсли;
				//				
				//			ИначеЕсли ЭлементДерева.ТипСтроки = 2 Тогда
				//				// Пользовательские настройки.
				//				Если Элементы.ГруппаНастроек.ТекущаяСтраница <> Элементы.ГруппаПользовательскихНастроек Тогда
				//					
				//					Элементы.ГруппаНастроек.ТекущаяСтраница = Элементы.ГруппаПользовательскихНастроек;
				//					
				//				КонецЕсли;
				//				
				//			Иначе
				// Неизвестный тип.
				//				Если Элементы.ГруппаНастроек.ТекущаяСтраница <> Элементы.ГруппаПустая Тогда
				//					
				//					Элементы.ГруппаНастроек.ТекущаяСтраница = Элементы.ГруппаПустая;
				//					
				//				КонецЕсли;
			КонецЕсли;

		КонецЕсли;

		Попытка

			СохранитьДанныеТекущейСтрокиИЗагрузитьТекущуюСтрокуНаСервере();
			ТекущаяСтрока = Элемент.ТекущаяСтрока;
			ИдетАктивацияСтроки = Ложь;

		Исключение

			ТекущаяСтрока = Неопределено; // Для того, чтобы не испортить настройки в дереве.
			ИдетАктивацияСтроки = Ложь;

		КонецПопытки;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииНастроек(Элемент)

	НастройкиТекущейСтрокиИзменены = Истина;
	Модифицированность = Истина;

КонецПроцедуры

&НаКлиенте
Процедура НастройкиОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	НастройкиТекущейСтрокиИзменены = Истина;
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура НастройкиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	НастройкиТекущейСтрокиИзменены = Истина;
	Модифицированность = Истина;
КонецПроцедуры

// Обработчик события ОбработкаДополнительнойРасшифровки табличного документа РезультатТабличныйДокумент.
&НаКлиенте
Процедура РезультатТабличныйДокументОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(АдресДанныхРасшифровки,
		Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыИсполненногоОтчета));
	ОбработкаРасшифровки.ПоказатьВыборДействия(
		Новый ОписаниеОповещения("РезультатТабличныйДокументОбработкаРасшифровкиЗавершение", ЭтаФорма,
		Новый Структура("Расшифровка", Расшифровка)), Расшифровка, , , , Элементы.РезультатТабличныйДокумент);

КонецПроцедуры

// Обработчик события ОбработкаРасшифровки табличного документа РезультатТабличныйДокумент.
&НаКлиенте
Процедура РезультатТабличныйДокументОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(АдресДанныхРасшифровки,
		Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыИсполненногоОтчета));
	ОбработкаРасшифровки.ПоказатьВыборДействия(
		Новый ОписаниеОповещения("РезультатТабличныйДокументОбработкаРасшифровкиЗавершение", ЭтаФорма,
		Новый Структура("Расшифровка", Расшифровка)), Расшифровка, , , Истина, );

КонецПроцедуры

// Обработчик события ПриСменеСтраницы панели ПанельРезультатов.
&НаКлиенте
Процедура ПанельРезультатовПриСменеСтраницы(Элемент, ТекущаяСтраница)

	Если Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатТабличныйДокумент Тогда

		Если ОтчетНужноФормировать И Не ЗаполненРезультатТабличныйДокумент Тогда

			Результат = СформироватьНаСервереВТабличныйДокумент();

		КонецЕсли;

	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаМакетКомпоновкиДанных Тогда

		Если ОтчетНужноФормировать И Не ЗаполненРезультатМакет Тогда

			Результат = СформироватьНаСервереВМакетКомпоновкиДанных();

		КонецЕсли;

	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаИсполняемыеНастройки Тогда

		Если ОтчетНужноФормировать И Не ЗаполненРезультатНастройки Тогда

			Результат = СформироватьНаСервереВИсполняемыеНастройкиКомпоновкиДанных();

		КонецЕсли;

	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаИсполняемыеНастройкиXML Тогда

		Если ОтчетНужноФормировать И Не ЗаполненРезультатНастройкиXML Тогда

			Результат = СформироватьНаСервереВИсполняемыеНастройкиКомпоновкиДанныхXML();

		КонецЕсли;

	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКомпоновкиДанныхXML Тогда

		Если ОтчетНужноФормировать И Не ЗаполненРезультатXML Тогда

			Результат = СформироватьНаСервереВВидеXML();

		КонецЕсли;

	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКоллекция Тогда

		Если ОтчетНужноФормировать И Не ЗаполненРезультатКоллекция Тогда

			Результат = СформироватьНаСервереВКоллекцию();

		КонецЕсли;

	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаМакетДляКоллекции Тогда

		Если ОтчетНужноФормировать И Не ЗаполненРезультатМакетДляКоллекции Тогда

			Результат = СформироватьНаСервереВМакетКомпоновкиДанныхДляКоллекции();

		КонецЕсли;

	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКоллекцияXML Тогда

		Если ОтчетНужноФормировать И Не ЗаполненРезультатКоллекцияXML Тогда

			Результат = СформироватьНаСервереВВидеXMLКоллекция();

		КонецЕсли;

	КонецЕсли;

	Если Результат <> Неопределено Тогда

		ПоказатьПредупреждение( , Результат);

	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыВнешниеНаборыДанных

&НаКлиенте
Процедура ВнешниеНаборыДанныхПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ТекДанные=Элементы.ВнешниеНаборыДанных.ТекущиеДанные;
	Если ТекДанные=Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УИ_ОбщегоНазначенияКлиент.РедактироватьТаблицуЗначений(ТекДанные.Значение, ЭтотОбъект,
		Новый ОписаниеОповещения("ВнешниеНаборыДанныхПредставлениеНачалоВыбораЗавершение", ЭтотОбъект,Новый Структура("ТекСтрока",Элементы.ВнешниеНаборыДанных.ТекущаяСтрока)));
КонецПроцедуры

&НаКлиенте
Процедура ВнешниеНаборыДанныхПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
	Если ОтменаРедактирования Тогда
		Возврат;
	КонецЕсли;	
		
	ТекДанные=Элементы.ВнешниеНаборыДанных.ТекущиеДанные;
	Если ТекДанные=Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекДанные.Имя=СокрЛП(ТекДанные.Имя);
	
	Если Не УИ_ОбщегоНазначенияКлиентСервер.ИмяПеременнойКорректно(ТекДанные.Имя) Тогда
		ПоказатьПредупреждение( ,
			УИ_ОбщегоНазначенияКлиентСервер.ТекстПредупрежденияОНерпавильномИмениПеременной(),
			, Заголовок);
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	ТекСтрокаДерева=ДеревоОтчетов.НайтиПоИдентификатору(ТекущаяСтрока);
	Если ТекСтрокаДерева=Неопределено Тогда
		Возврат;
	КонецЕсли;

	
	маСтрокиИмени = ТекСтрокаДерева.ВнешниеНаборыДанных.НайтиСтроки(Новый Структура("Имя", ТекДанные.Имя));
	Если маСтрокиИмени.Количество() > 1 Тогда
		ПоказатьПредупреждение( , "Колонка с таким именем уже есть! Введите другое имя.", , Заголовок);
		Отказ = Истина;
		Возврат;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыРезультатДерево

// Обработчик события Выбор таблицы РезультатДерево.
&НаКлиенте
Процедура РезультатДеревоВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	Перем Значение;

	СтандартнаяОбработка = Ложь;

	Если Элементы.РезультатДерево.ТекущиеДанные.Свойство(Элементы.РезультатДерево.ТекущийЭлемент.Имя, Значение) Тогда

		ПоказатьЗначение( , Значение);

	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоОтчетов

// Обработчик события ПередНачаломДобавления элемента ДеревоОтчетов.
&НаКлиенте
Процедура ДеревоОтчетовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)

	Если Копирование Тогда

		Отказ = Истина;

		Если ДеревоОтчетов.НайтиПоИдентификатору(Элемент.ТекущаяСтрока).ТипСтроки <> 4 Тогда
		// Не корень.
			СкопироватьНаСервере();

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Обработчик события ПередУдалением элемента ДеревоОтчетов.
&НаКлиенте
Процедура ДеревоОтчетовПередУдалением(Элемент, Отказ)

	ТекущаяСтрока = Неопределено;

КонецПроцедуры

// Обработчик события Выбор элемента ДеревоОтчетов.
&НаКлиенте
Процедура ДеревоОтчетовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	СформироватьКлиент();

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

// Обработчик команды ДобавитьСхемуКомпоновкиДанных.
&НаКлиенте
Процедура ДобавитьСхемуКомпоновкиДанных(Команда)

	Перем ЭлементыВКоторыеДобавляем;
	Перем ТекущийЭлементДерева;

	Модифицированность = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		ТекущийЭлементДерева = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

	КонецЕсли;

	Пока ТекущийЭлементДерева <> Неопределено Цикл

		Если ТекущийЭлементДерева.ТипСтроки = 0 Или (ТекущийЭлементДерева.ТипСтроки = 3 И ТипПапки(
			ТекущийЭлементДерева) = 4) Или ТекущийЭлементДерева.ТипСтроки = 4 Тогда

			Прервать;

		Иначе

			ТекущийЭлементДерева = ТекущийЭлементДерева.ПолучитьРодителя();

		КонецЕсли;

	КонецЦикла;

	Если ТекущийЭлементДерева <> Неопределено Тогда

		Если ТекущийЭлементДерева.ТипСтроки = 3 Или ТекущийЭлементДерева.ТипСтроки = 4 Тогда

				// Папка или корень.
			ЭлементыВКоторыеДобавляем = ТекущийЭлементДерева.ПолучитьЭлементы();

		ИначеЕсли ТекущийЭлементДерева.ПолучитьРодителя() <> Неопределено Тогда

			ЭлементыВКоторыеДобавляем = ТекущийЭлементДерева.ПолучитьРодителя().ПолучитьЭлементы();

		Иначе

			ЭлементыВКоторыеДобавляем = ДеревоОтчетов.ПолучитьЭлементы();

		КонецЕсли;

	Иначе

		ЭлементыВКоторыеДобавляем = ДеревоОтчетов.ПолучитьЭлементы();

	КонецЕсли;

	Имя = СгенерироватьИмяСхемыКомпоновкиДанных();
	Элемент = ЭлементыВКоторыеДобавляем.Добавить();
	Элемент.Имя = Имя;
	Элемент.ТипСтроки = 0;

	Элементы.ДеревоОтчетов.ТекущаяСтрока = Элемент.ПолучитьИдентификатор();

КонецПроцедуры

// Обработчик команды Сформировать.
&НаКлиенте
Процедура Сформировать(Команда)

	СформироватьКлиент();

КонецПроцедуры

// Обработчик команды ПанельРезультатов.
&НаКлиенте
Процедура ПанельРезультатов(Команда)

	Элементы.ПанельРезультатов.Видимость = Не Элементы.ПанельРезультатов.Видимость;
	Элементы.ПанельРезультатовКнопка.Пометка = Элементы.ПанельРезультатов.Видимость;

КонецПроцедуры

// Обработчик команды КонструкторСхемыКомпоновкиДанных.
&НаКлиенте
Процедура КонструкторСхемыКомпоновкиДанных(Команда)

	ОткрытьКонструкторСхемыКомпоновкиДанных();

КонецПроцедуры

// Обработчик команды СохранитьОтчетыВФайл.
&НаКлиенте
Процедура СохранитьОтчетыВФайл(Команда)

//	СохранитьДанныеТекущейСтрокиИЗагрузитьТекущуюСтрокуНаСервере();
	СохранитьДанныеТекущейСтрокиНаСервере();
	Сохранить(Ложь, Новый ОписаниеОповещения("СохранениеВФайлЗавершение", ЭтаФорма));

КонецПроцедуры

// Обработчик команды СохранитьОтчетыВФайлКак.
&НаКлиенте
Процедура СохранитьОтчетыВФайлКак(Команда)

	Сохранить(Истина, Новый ОписаниеОповещения("СохранениеВФайлЗавершение", ЭтаФорма));

КонецПроцедуры

// Обработчик команды ОткрытьФайлОтчетов.
&НаКлиенте
Процедура ОткрытьФайлОтчетов(Команда)

	ПодтвердитьЗакрытие(Новый ОписаниеОповещения("ОткрытьФайлОтчетовЗавершение", ЭтаФорма));

КонецПроцедуры

// Обработчик команды НовыйФайлОтчетов.
&НаКлиенте
Процедура НовыйФайлОтчетов(Команда)

	ПодтвердитьЗакрытие(Новый ОписаниеОповещения("НовыйФайлОтчетовЗавершение", ЭтаФорма));

КонецПроцедуры

// Обработчик команды ВывестиВТабличныйДокументДляТекущегоМакета.
&НаКлиенте
Процедура ВывестиВТабличныйДокументДляТекущегоМакета(Команда)

	ВыполнитьНаСервереИзМакетаКомпоновкиДанных();

КонецПроцедуры

// Обработчик команды СохранитьЭталонТабличногоДокумента.
&НаКлиенте
Процедура СохранитьЭталонТабличногоДокумента(Команда)

	Если Не ЗначениеЗаполнено(АдресЭталонаТабличногоДокументаВоВременномХранилище) Тогда
		АдресЭталонаТабличногоДокументаВоВременномХранилище = ПоместитьВоВременноеХранилище(РезультатТабличныйДокумент,
			УникальныйИдентификатор);
	Иначе
		АдресЭталонаТабличногоДокументаВоВременномХранилище = ПоместитьВоВременноеХранилище(РезультатТабличныйДокумент,
			АдресЭталонаТабличногоДокументаВоВременномХранилище);
	КонецЕсли;

КонецПроцедуры

// Обработчик команды СравнитьСЭталономТабличныйДокумент.
&НаКлиенте
Процедура СравнитьСЭталономТабличныйДокумент(Команда)
	Если Не ЗначениеЗаполнено(АдресЭталонаТабличногоДокументаВоВременномХранилище) Тогда
		ПоказатьПредупреждение(, "Нет сохраненного эталона");
		Возврат;
	КонецЕсли;

	АдресТекущегоДокумента = ПоместитьВоВременноеХранилище(РезультатТабличныйДокумент, УникальныйИдентификатор);
	УИ_ОбщегоНазначенияКлиент.СравнитьТабличныеДокументы(АдресТекущегоДокумента,
		АдресЭталонаТабличногоДокументаВоВременномХранилище, "Текущий", "Эталон");

КонецПроцедуры

// Обработчик команды СохранитьЭталонМакетаКомпоновкиДанных.
&НаКлиенте
Процедура СохранитьЭталонМакетаКомпоновкиДанных(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаЭталонаМакета(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ТекстМакетаКомпоновкиДанных);
	ЗаписьТекста.Закрыть();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СравнитьСЭталономМакетКомпоновкиДанных.
&НаКлиенте
Процедура СравнитьСЭталономМакетКомпоновкиДанных(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаМакета(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ТекстМакетаКомпоновкиДанных);
	ЗаписьТекста.Закрыть();

	СравнениеФайлов = Новый СравнениеФайлов;
	СравнениеФайлов.ПервыйФайл = ИмяФайлаЭталонаМакета();
	СравнениеФайлов.ВторойФайл = ИмяФайлаМакета();
	СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент;
	СравнениеФайлов.ПоказатьРазличия();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СохранитьЭталонИсполняемыхНастроек.
&НаКлиенте
Процедура СохранитьЭталонИсполняемыхНастроек(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаЭталонаИсполняемыхНастроек(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ИсполняемыеНастройкиXML);
	ЗаписьТекста.Закрыть();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СравнитьСЭталономИсполняемыхНастроек.
&НаКлиенте
Процедура СравнитьСЭталономИсполняемыхНастроек(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаИсполняемыхНастроек(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ИсполняемыеНастройкиXML);
	ЗаписьТекста.Закрыть();

	СравнениеФайлов = Новый СравнениеФайлов;
	СравнениеФайлов.ПервыйФайл = ИмяФайлаЭталонаИсполняемыхНастроек();
	СравнениеФайлов.ВторойФайл = ИмяФайлаИсполняемыхНастроек();
	СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент;
	СравнениеФайлов.ПоказатьРазличия();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СохранитьЭталонРезультатаXML.
&НаКлиенте
Процедура СохранитьЭталонРезультатаXML(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаЭталонаРезультатаXML(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ТекстРезультатаКомпоновкиДанных);
	ЗаписьТекста.Закрыть();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СравнитьСЭталономРезультатXML.
&НаКлиенте
Процедура СравнитьСЭталономРезультатXML(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаРезультатаXML(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ТекстРезультатаКомпоновкиДанных);
	ЗаписьТекста.Закрыть();

	СравнениеФайлов = Новый СравнениеФайлов;
	СравнениеФайлов.ПервыйФайл = ИмяФайлаЭталонаРезультатаXML();
	СравнениеФайлов.ВторойФайл = ИмяФайлаРезультатаXML();
	СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент;
	СравнениеФайлов.ПоказатьРазличия();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СохранитьЭталонМакетаКомпоновкиДанныхДляКоллекции.
&НаКлиенте
Процедура СохранитьЭталонМакетаКомпоновкиДанныхДляКоллекции(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаЭталонаМакетаДляКоллекции(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ТекстМакетаКомпоновкиДанныхДляКоллекции);
	ЗаписьТекста.Закрыть();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СравнитьСЭталономМакетКомпоновкиДанныхДляКоллекции.
&НаКлиенте
Процедура СравнитьСЭталономМакетКомпоновкиДанныхДляКоллекции(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаМакетаДляКоллекции(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ТекстМакетаКомпоновкиДанныхДляКоллекции);
	ЗаписьТекста.Закрыть();

	СравнениеФайлов = Новый СравнениеФайлов;
	СравнениеФайлов.ПервыйФайл = ИмяФайлаЭталонаМакетаДляКоллекции();
	СравнениеФайлов.ВторойФайл = ИмяФайлаМакетаДляКоллекции();
	СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент;
	СравнениеФайлов.ПоказатьРазличия();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СохранитьЭталонРезультатаXMLДляКоллекции.
&НаКлиенте
Процедура СохранитьЭталонРезультатаXMLДляКоллекции(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаЭталонаРезультатаXMLДляКоллекции(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ТекстРезультатаКомпоновкиДанныхДляКоллекции);
	ЗаписьТекста.Закрыть();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды СравнитьСЭталономРезультатXMLДляКоллекции.
&НаКлиенте
Процедура СравнитьСЭталономРезультатXMLДляКоллекции(Команда)

#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаРезультатаXMLДляКоллекции(), , Символы.ВК + Символы.ПС, , "");
	ЗаписьТекста.ЗаписатьСтроку(ТекстРезультатаКомпоновкиДанныхДляКоллекции);
	ЗаписьТекста.Закрыть();

	СравнениеФайлов = Новый СравнениеФайлов;
	СравнениеФайлов.ПервыйФайл = ИмяФайлаЭталонаРезультатаXMLДляКоллекции();
	СравнениеФайлов.ВторойФайл = ИмяФайлаРезультатаXMLДляКоллекции();
	СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент;
	СравнениеФайлов.ПоказатьРазличия();
#Иначе
		ПоказатьПредупреждение( , НСтр("ru='Сравнение файлов возможно только в толстом клиенте'"));
#КонецЕсли

КонецПроцедуры

// Обработчик команды ВывестиВРезультатДляТекущегоМакета.
&НаКлиенте
Процедура ВывестиВРезультатДляТекущегоМакета(Команда)

	ВыполнитьВРезультатНаСервереИзМакетаКомпоновкиДанных();

КонецПроцедуры

// Обработчик команды ВывестиРезультатВТабличныйДокумент.
&НаКлиенте
Процедура ВывестиРезультатВТабличныйДокумент(Команда)

	ВывестиРезультатИзТекстаРезультатаВТабличныйДокумент();

КонецПроцедуры

// Обработчик команды ВывестиВКоллекциюДляТекущегоМакета.
&НаКлиенте
Процедура ВывестиВКоллекциюДляТекущегоМакета(Команда)

	ВыполнитьНаСервереИзМакетаКомпоновкиДанныхВКоллекцию();

КонецПроцедуры

// Обработчик команды ВывестиВРезультатКоллекцииДляТекущегоМакета.
&НаКлиенте
Процедура ВывестиВРезультатКоллекцииДляТекущегоМакета(Команда)

	ВыполнитьВРезультатКоллекцияНаСервереИзМакетаКомпоновкиДанных();

КонецПроцедуры

// Обработчик команды ВывестиРезультатВКоллекцию.
&НаКлиенте
Процедура ВывестиРезультатВКоллекцию(Команда)

	ВывестиРезультатИзТекстаРезультатаВКоллекцию();

КонецПроцедуры

// Обработчик команды СохранитьСхемуВФайл
&НаКлиенте
Процедура СохранитьСхемуВФайл(Команда)

	НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения("СохранитьСхемуВФайлПослеПодключенияРасширения",
		ЭтаФорма));

КонецПроцедуры

// Обработчик команды ЗагрузитьСхемуИзФайла
&НаКлиенте
Процедура ЗагрузитьСхемуИзФайла(Команда)

	Перем Адрес;

	НачатьПодключениеРасширенияРаботыСФайлами(
		Новый ОписаниеОповещения("ЗагрузитьСхемуИзФайлаПослеПодключенияРасширения", ЭтаФорма, Новый Структура("Адрес",
		Адрес)));
КонецПроцедуры

&НаКлиенте
Процедура Настройки(Команда)
	ОтобразитьПанельНастроек();
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВКонсолиЗапросов(Команда)
	Адрес = ПодготовитьДанныеЗапросовДляКонсоли();
	
	Если ЗначениеЗаполнено(Адрес) Тогда
		ПараметрыФормы = Новый Структура("АдресЗапросовИзСКД", Адрес);
		ОткрытьФорму("Обработка.УИ_КонсольЗапросов.Форма", ПараметрыФормы, , Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьНастройкиИзВариантаОтчета(Команда)
	ВариантыНастроекСхемыКомпоновки = ВариантыОтчетаСхемыКомпоновкиТекущейСтрокиДерева();

	ВариантыНастроекСхемыКомпоновки.ПоказатьВыборЭлемента(Новый ОписаниеОповещения("ЗагрузитьНастройкиИзВариантаОтчетаЗавершениеВыбораВарианта",
		ЭтотОбъект));
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура  ЗагрузитьНастройкиИзВариантаОтчетаЗавершениеВыбораВарианта(ВыбранныйЭлемент,ДополнительныеПараметры) Экспорт
	Если ВыбранныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗагрузитьНастройкиИзВариантаОтчетаНаСервере(ВыбранныйЭлемент.Значение);
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНастройкиИзВариантаОтчетаНаСервере(ВариантДляЗагрузки) 
	СКД = ПолучитьСхемуКомпоновкиДанныхСервер();
	
	Попытка
		ВариантНастроекСКД = СКД.ВариантыНастроек[ВариантДляЗагрузки];
	Исключение
		Сообщить("Не удалось получить настройки выбранного варианта");
	КонецПопытки;
	
	ТекСтрокаДерева = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

	Если ТекСтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML,
								 ВариантНастроекСКД.Настройки,
								 "Settings",
								 "http://v8.1c.ru/8.1/data-composition-system/settings");
	ТекСтрокаДерева.НастройкиСКД = ЗаписьXML.Закрыть();
	Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ВариантНастроекСКД.Настройки);
	
КонецПроцедуры

// Варианты отчета схемы компоновки текущей строки дерева.
// 
// Возвращаемое значение:
//  СписокЗначений Из Строка
&НаСервере
Функция ВариантыОтчетаСхемыКомпоновкиТекущейСтрокиДерева()
	СКД = ПолучитьСхемуКомпоновкиДанныхСервер();
	
	СписокВариантов = Новый СписокЗначений;
	
	Для Каждого ТекВариант Из СКД.ВариантыНастроек Цикл
		СписокВариантов.Добавить(ТекВариант.Имя, ТекВариант.Представление);	
	КонецЦикла;
	
	Возврат СписокВариантов;		
КонецФункции

// Завершение обработчика открытия файла.
&НаКлиенте
Процедура СохранениеВФайлЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Если Результат Тогда
		Модифицированность = Ложь;
	КонецЕсли;

КонецПроцедуры

// Завершение обработчика открытия файла.
&НаКлиенте
Процедура ОткрытьФайлОтчетовЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Если Результат Тогда
		Модифицированность = Ложь;
		ЗагрузитьФайлКонсоли("");
	КонецЕсли;

КонецПроцедуры

// Завершение обработчика создания нового файла отчетов.
&НаКлиенте
Процедура НовыйФайлОтчетовЗавершение(Результат, ДополнительныеПараметры) Экспорт

	Если Результат Тогда

		Модифицированность = Ложь;
		ИнициализироватьДеревоОтчетов(ДеревоОтчетов);
		ИмяФайла = "";
		ОбновитьЗаголовок();
		ТекущаяСтрока = Неопределено;
		НастройкиТекущейСтрокиИзменены = Ложь;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура СравнитьСЭталономТабличныйДокументЗавершение(Результат, ДополнительныеПараметры) Экспорт

	УИ_ОбщегоНазначенияКлиент.СравнитьФайлыТабличныхДокументов(ИмяФайлаЭталонаТабличногоДокумента(),
		ИмяФайлаТабличногоДокумента(), "Эталон", "Текущий");

КонецПроцедуры

// Обработчик сохранения схемы в файл после подключения расширения работы с файлами.
&НаКлиенте
Процедура СохранитьСхемуВФайлПослеПодключенияРасширения(Подключено, ДополнительныеПараметры) Экспорт

	Если Подключено Тогда

	// Нужно запросить имя файла.
		ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
		ВыборФайла.МножественныйВыбор = Ложь;
		Фильтр = НСтр("ru = 'Файл схемы компоновки данных (*.xml)|*.xml|Все файлы (*.*)|*.*'");
		ВыборФайла.Фильтр = Фильтр;
		ВыборФайла.Расширение = "xml";

		ВыборФайла.Показать(Новый ОписаниеОповещения("СохранитьСхемуВФайлПослеВыбораФайла", ЭтаФорма,
			Новый Структура("ВыборФайла", ВыборФайла)));

	Иначе

		ПолучитьФайл(ПоместитьСхемуКомпоновкиДанныхВоВременноеХранилище(), , Истина);

	КонецЕсли;

КонецПроцедуры

// Обработчик сохранния схемы в файл после выбора файла сохранения.
&НаКлиенте
Процедура СохранитьСхемуВФайлПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	ВыборФайла = ДополнительныеПараметры.ВыборФайла;

	Если ВыбранныеФайлы = Неопределено Тогда

		Возврат;

	КонецЕсли;

	ПолучаемыеФайлы = Новый Массив;
	ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ВыборФайла.ПолноеИмяФайла,
		ПоместитьСхемуКомпоновкиДанныхВоВременноеХранилище()));
	НачатьПолучениеФайлов(Новый ОписаниеОповещения("СохранитьСхемуВФайлЗавершение", ЭтаФорма), ПолучаемыеФайлы, "",
		Ложь);

КонецПроцедуры

&НаКлиенте
Процедура СохранитьСхемуВФайлЗавершение(ПолученныеФайлы, ДополнительныеПараметры) Экспорт

	ОбновитьЗаголовок();

КонецПроцедуры

// Обработчик загрузки схемы из файла после подключения расширения.
&НаКлиенте
Процедура ЗагрузитьСхемуИзФайлаПослеПодключенияРасширения(Подключено, ДополнительныеПараметры) Экспорт

	Адрес = ДополнительныеПараметры.Адрес;

	Если Подключено Тогда

		ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
		ВыборФайла.МножественныйВыбор = Ложь;
		Фильтр = НСтр("ru = 'Файл схемы компоновки данных (*.xml)|*.xml|Все файлы (*.*)|*.*'");
		ВыборФайла.Фильтр = Фильтр;
		ВыборФайла.Расширение = "xml";

		НачатьПомещениеФайлов(Новый ОписаниеОповещения("ЗагрузитьСхемуИзФайлаПослеПомещенияФайлов", ЭтаФорма), ,
			ВыборФайла);

	Иначе

		НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьСхемуИзФайлаПослеПомещенияФайла", ЭтаФорма,
			Новый Структура("Адрес", Адрес)), Адрес, , Истина);

	КонецЕсли;

КонецПроцедуры

// Обработчик загрузки схемы из файла после помещения файлов.
&НаКлиенте
Процедура ЗагрузитьСхемуИзФайлаПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт

	Если ПомещенныеФайлы = Неопределено Тогда

		Возврат;

	КонецЕсли;

	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл

		Если ПомещенныйФайл.Хранение <> "" Тогда

			Адрес = ПомещенныйФайл.Хранение;
			Прервать;

		КонецЕсли;

	КонецЦикла;

	ЗагрузитьФайлСхемыКомпоновкиДанныхНаСервере(Адрес);

КонецПроцедуры

// Обработчик загрузки схемы из файла после помещения файла.
&НаКлиенте
Процедура ЗагрузитьСхемуИзФайлаПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

	Адрес = ДополнительныеПараметры.Адрес;

	Если Не Результат Тогда

		Возврат;

	КонецЕсли;

	ЗагрузитьФайлСхемыКомпоновкиДанныхНаСервере(Адрес);

КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

// Инициализировать новое дерево отчетов.
&НаКлиентеНаСервереБезКонтекста
Процедура ИнициализироватьДеревоОтчетов(ДеревоОтчетов)

	Элементы = ДеревоОтчетов.ПолучитьЭлементы();
	Элементы.Очистить();
	КорневойЭлемент = Элементы.Добавить();
	КорневойЭлемент.ТипСтроки = 4;
	КорневойЭлемент.Имя = НСтр("ru='Отчеты'");

	ЭлементыВКоторыеДобавляем = КорневойЭлемент.ПолучитьЭлементы();

	Имя = "Отчет";
	Элемент = ЭлементыВКоторыеДобавляем.Добавить();
	Элемент.Имя = Имя;
	Элемент.ТипСтроки = 0;

КонецПроцедуры

// Переключить страницу группировок на страницу с текстом недоступности.
&НаКлиенте
Процедура ПоляГруппировкиНедоступны()

	Элементы.СтраницыПолейГруппировки.ТекущаяСтраница = Элементы.НедоступныеНастройкиПолейГруппировки;

КонецПроцедуры

// Переключить страницу группировок на страницу с текстом недоступности для исполняемых настроек.
&НаКлиенте
Процедура ПоляГруппировкиНедоступны1()

	Элементы.СтраницыПолейГруппировки1.ТекущаяСтраница = Элементы.НедоступныеНастройкиПолейГруппировки1;

КонецПроцедуры

// Включить доступность выбранных полей.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура ВыбранныеПоляДоступны(ЭлементСтруктуры)

	Если Отчет.КомпоновщикНастроек.Настройки.НаличиеВыбораУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныеВыбранныеПоля = Истина;
		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей;

	Иначе

		ЛокальныеВыбранныеПоля = Ложь;
		Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.ОтключенныеНастройкиВыбранныхПолей;

	КонецЕсли;

	Элементы.ЛокальныеВыбранныеПоля.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Включить доступность выбранных полей для исполняемых настроек.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура ВыбранныеПоляДоступны1(ЭлементСтруктуры)

	Если ИсполняемыйКомпоновщикНастроек.Настройки.НаличиеВыбораУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныеВыбранныеПоля1 = Истина;
		Элементы.СтраницыПолейВыбора1.ТекущаяСтраница = Элементы.НастройкиВыбранныхПолей1;

	Иначе

		ЛокальныеВыбранныеПоля1 = Ложь;
		Элементы.СтраницыПолейВыбора1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиВыбранныхПолей1;

	КонецЕсли;

	Элементы.ЛокальныеВыбранныеПоля1.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Переключить страницу выбранных полей на страницу с текстом недоступности.
&НаКлиенте
Процедура ВыбранныеПоляНедоступны()

	ЛокальныеВыбранныеПоля = Ложь;
	Элементы.ЛокальныеВыбранныеПоля.ТолькоПросмотр = Истина;
	Элементы.СтраницыПолейВыбора.ТекущаяСтраница = Элементы.НедоступныеНастройкиВыбранныхПолей;

КонецПроцедуры

// Переключить страницу выбранных полей на страницу с текстом недоступности для исполняемых настроек.
&НаКлиенте
Процедура ВыбранныеПоляНедоступны1()

	ЛокальныеВыбранныеПоля1 = Ложь;
	Элементы.ЛокальныеВыбранныеПоля1.ТолькоПросмотр = Истина;
	Элементы.СтраницыПолейВыбора1.ТекущаяСтраница = Элементы.НедоступныеНастройкиВыбранныхПолей1;

КонецПроцедуры

// Включить доступность отбора.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура ОтборДоступен(ЭлементСтруктуры)

	Если Отчет.КомпоновщикНастроек.Настройки.НаличиеОтбораУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныйОтбор = Истина;
		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.НастройкиОтбора;

	Иначе

		ЛокальныйОтбор = Ложь;
		Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.ОтключенныеНастройкиОтбора;

	КонецЕсли;

	Элементы.ЛокальныйОтбор.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Включить доступность отбора для исполняемых настроек.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура ОтборДоступен1(ЭлементСтруктуры)

	Если ИсполняемыйКомпоновщикНастроек.Настройки.НаличиеОтбораУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныйОтбор1 = Истина;
		Элементы.СтраницыОтбора1.ТекущаяСтраница = Элементы.НастройкиОтбора1;

	Иначе

		ЛокальныйОтбор1 = Ложь;
		Элементы.СтраницыОтбора1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиОтбора1;

	КонецЕсли;

	Элементы.ЛокальныйОтбор1.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Переключить страницу отбора на страницу с текстом недоступности.
&НаКлиенте
Процедура ОтборНедоступен()

	ЛокальныйОтбор = Ложь;
	Элементы.ЛокальныйОтбор.ТолькоПросмотр = Истина;
	Элементы.СтраницыОтбора.ТекущаяСтраница = Элементы.НедоступныеНастройкиОтбора;

КонецПроцедуры

// Переключить страницу отбора на страницу с текстом недоступности для исполняемых настроек.
&НаКлиенте
Процедура ОтборНедоступен1()

	ЛокальныйОтбор1 = Ложь;
	Элементы.ЛокальныйОтбор1.ТолькоПросмотр = Истина;
	Элементы.СтраницыОтбора1.ТекущаяСтраница = Элементы.НедоступныеНастройкиОтбора1;

КонецПроцедуры

// Включить доступность порядка.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура ПорядокДоступен(ЭлементСтруктуры)

	Если Отчет.КомпоновщикНастроек.Настройки.НаличиеПорядкаУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныйПорядок = Истина;
		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.НастройкиПорядка;

	Иначе

		ЛокальныйПорядок = Ложь;
		Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПорядка;

	КонецЕсли;

	Элементы.ЛокальныйПорядок.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Включить доступность порядка для исполняемых настроек.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура ПорядокДоступен1(ЭлементСтруктуры)

	Если ИсполняемыйКомпоновщикНастроек.Настройки.НаличиеПорядкаУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныйПорядок1 = Истина;
		Элементы.СтраницыПорядка1.ТекущаяСтраница = Элементы.НастройкиПорядка1;

	Иначе

		ЛокальныйПорядок1 = Ложь;
		Элементы.СтраницыПорядка1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПорядка1;

	КонецЕсли;

	Элементы.ЛокальныйПорядок1.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Переключить страницу порядка на страницу с текстом недоступности.
&НаКлиенте
Процедура ПорядокНедоступен()

	ЛокальныйПорядок = Ложь;
	Элементы.ЛокальныйПорядок.ТолькоПросмотр = Истина;
	Элементы.СтраницыПорядка.ТекущаяСтраница = Элементы.НедоступныеНастройкиПорядка;

КонецПроцедуры

// Переключить страницу порядка на страницу с текстом недоступности для исполняемых настроек.
&НаКлиенте
Процедура ПорядокНедоступен1()

	ЛокальныйПорядок1 = Ложь;
	Элементы.ЛокальныйПорядок1.ТолькоПросмотр = Истина;
	Элементы.СтраницыПорядка1.ТекущаяСтраница = Элементы.НедоступныеНастройкиПорядка1;

КонецПроцедуры

// Включить доступность условного оформления.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура УсловноеОформлениеДоступно(ЭлементСтруктуры)

	Если Отчет.КомпоновщикНастроек.Настройки.НаличиеУсловногоОформленияУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальноеУсловноеОформление = Истина;
		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления;

	Иначе

		ЛокальноеУсловноеОформление = Ложь;
		Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.ОтключенныеНастройкиУсловногоОформления;

	КонецЕсли;

	Элементы.ЛокальноеУсловноеОформление.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Включить доступность условного оформления для исполняемых настроек.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура УсловноеОформлениеДоступно1(ЭлементСтруктуры)

	Если ИсполняемыйКомпоновщикНастроек.Настройки.НаличиеУсловногоОформленияУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальноеУсловноеОформление1 = Истина;
		Элементы.СтраницыУсловногоОформления1.ТекущаяСтраница = Элементы.НастройкиУсловногоОформления1;

	Иначе

		ЛокальноеУсловноеОформление1 = Ложь;
		Элементы.СтраницыУсловногоОформления1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиУсловногоОформления1;

	КонецЕсли;

	Элементы.ЛокальноеУсловноеОформление1.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Переключить страницу условного оформления на страницу с текстом недоступности.
&НаКлиенте
Процедура УсловноеОформлениеНедоступно()

	ЛокальноеУсловноеОформление = Ложь;
	Элементы.ЛокальноеУсловноеОформление.ТолькоПросмотр = Истина;
	Элементы.СтраницыУсловногоОформления.ТекущаяСтраница = Элементы.НедоступныеНастройкиУсловногоОформления;

КонецПроцедуры

// Переключить страницу условного оформления на страницу с текстом недоступности для исполняемых настроек.
&НаКлиенте
Процедура УсловноеОформлениеНедоступно1()

	ЛокальноеУсловноеОформление1 = Ложь;
	Элементы.ЛокальноеУсловноеОформление1.ТолькоПросмотр = Истина;
	Элементы.СтраницыУсловногоОформления1.ТекущаяСтраница = Элементы.НедоступныеНастройкиУсловногоОформления1;

КонецПроцедуры

// Включить доступность параметров вывода.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура ПараметрыВыводаДоступны(ЭлементСтруктуры)

	Если Отчет.КомпоновщикНастроек.Настройки.НаличиеПараметровВыводаУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныеПараметрыВывода = Истина;
		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.НастройкиПараметровВывода;

	Иначе

		ЛокальныеПараметрыВывода = Ложь;
		Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПараметровВывода;

	КонецЕсли;

	Элементы.ЛокальныеПараметрыВывода.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Включить доступность параметров вывода для исполняемых настроек.
//
// Параметры: 
//  ЭлементСтруктуры - элемент структуры, для которого изменяется доступность.
&НаКлиенте
Процедура ПараметрыВыводаДоступны1(ЭлементСтруктуры)

	Если ИсполняемыйКомпоновщикНастроек.Настройки.НаличиеПараметровВыводаУЭлемента(ЭлементСтруктуры) Тогда

		ЛокальныеПараметрыВывода1 = Истина;
		Элементы.СтраницыПараметровВывода1.ТекущаяСтраница = Элементы.НастройкиПараметровВывода1;

	Иначе

		ЛокальныеПараметрыВывода1 = Ложь;
		Элементы.СтраницыПараметровВывода1.ТекущаяСтраница = Элементы.ОтключенныеНастройкиПараметровВывода1;

	КонецЕсли;

	Элементы.ЛокальныеПараметрыВывода1.ТолькоПросмотр = Ложь;

КонецПроцедуры

// Переключить страницу параметров вывода на страницу с текстом недоступности.
&НаКлиенте
Процедура ПараметрыВыводаНедоступны()

	ЛокальныеПараметрыВывода = Ложь;
	Элементы.ЛокальныеПараметрыВывода.ТолькоПросмотр = Истина;
	Элементы.СтраницыПараметровВывода.ТекущаяСтраница = Элементы.НедоступныеНастройкиПараметровВывода;

КонецПроцедуры

// Переключить страницу параметров вывода на страницу с текстом недоступности для исполняемых настроек.
&НаКлиенте
Процедура ПараметрыВыводаНедоступны1()

	ЛокальныеПараметрыВывода1 = Ложь;
	Элементы.ЛокальныеПараметрыВывода1.ТолькоПросмотр = Истина;
	Элементы.СтраницыПараметровВывода1.ТекущаяСтраница = Элементы.НедоступныеНастройкиПараметровВывода1;

КонецПроцедуры

// Сгенерировать имя от базовой части имени на сервере.
//
// Параметры:
//  ТипСтроки - тип строки, для которой генерируется имя.
//  БазоваяЧастьИмени - начальная часть имени.
//  КоллекцияЭлементов - коллекция элементов в рамках которой проверяется 
//						 уникальность имени.
//  Рекурсивно - необходимость рекурсивной проверки уникальности имен
//				 в коллекции КоллекцияЭлементов.
//
// Возвращаемое значение:
//   Строка - сгенерированное имя.
&НаСервере
Функция СгенерироватьИмяСервер(ТипСтроки, БазоваяЧастьИмени, КоллекцияЭлементов, Рекурсивно)

	УникальныеИмена = Новый Соответствие;
	НайтиУникальныеИменаСервер(КоллекцияЭлементов, ТипСтроки, УникальныеИмена, Рекурсивно);
	ИндексИмени = 1;

	Пока Истина Цикл

		Имя = БазоваяЧастьИмени + ?(ИндексИмени > 1, " " + Строка(ИндексИмени), "");

		Если УникальныеИмена.Получить(Имя) <> Истина Тогда

			Возврат Имя;

		КонецЕсли;

		ИндексИмени = ИндексИмени + 1;

	КонецЦикла;

КонецФункции

// Сгенерировать имя от базовой части имени на клиенте.
//
// Параметры:
//  ТипСтроки - тип строки, для которой генерируется имя.
//  БазоваяЧастьИмени - начальная часть имени.
//  КоллекцияЭлементов - коллекция элементов в рамках которой проверяется
//						 уникальность имени.
//  Рекурсивно - необходимость рекурсивной проверки уникальности имен
//				 в коллекции КоллекцияЭлементов.
//
// Возвращаемое значение:
//   Строка - сгенерированное имя.
&НаКлиенте
Функция СгенерироватьИмя(ТипСтроки, БазоваяЧастьИмени, КоллекцияЭлементов, Рекурсивно)

	УникальныеИмена = Новый Соответствие;
	НайтиУникальныеИмена(КоллекцияЭлементов, ТипСтроки, УникальныеИмена, Рекурсивно);
	ИндексИмени = 1;

	Пока Истина Цикл

		Имя = БазоваяЧастьИмени + ?(ИндексИмени > 1, " " + Строка(ИндексИмени), "");
		Если УникальныеИмена.Получить(Имя) <> Истина Тогда

			Возврат Имя;

		КонецЕсли;
		ИндексИмени = ИндексИмени + 1;

	КонецЦикла;

КонецФункции

// Найти строки с указанным типом строки в коллекции элементов. Рекурсивно.
//
// Параметры:
//  КоллекцияЭлементов - коллекция элементов, в которой нужно искать.
//  ТипСтроки - тип строки, который нужно найти.
//  НайденныеСтроки - массив найденных строк.
&НаКлиентеНаСервереБезКонтекста
Процедура НайтиСтроки(КоллекцияЭлементов, ТипСтроки, НайденныеСтроки)

	Для Каждого Элемент Из КоллекцияЭлементов Цикл

		Если Элемент.ТипСтроки = ТипСтроки Тогда

			НайденныеСтроки.Добавить(Элемент);

		КонецЕсли;

		НайтиСтроки(Элемент.ПолучитьЭлементы(), ТипСтроки, НайденныеСтроки);

	КонецЦикла;

КонецПроцедуры

// Сгенерировать имя для схемы компоновки данных.
//
// Возвращаемое значение:
//  Стока - сгенерированное имя схемы компоновки данных.
&НаКлиенте
Функция СгенерироватьИмяСхемыКомпоновкиДанных()

	Возврат СгенерироватьИмя(0, НСтр("ru='Отчет'"), ДеревоОтчетов.ПолучитьЭлементы(), Истина);

КонецФункции

// Сгенерировать имя для варианта отчета.
//
// Параметры:
//  КоллекцияЭлементов - коллекция элементов, в которую добавляется вариант отчета.
//
// Возвращаемое значение:
//  Стока - сгенерированное имя варианта.
&НаКлиенте
Функция СгенерироватьИмяВариантаОтчета(КоллекцияЭлементов)

	Возврат СгенерироватьИмя(1, НСтр("ru='Вариант'"), КоллекцияЭлементов, Ложь);

КонецФункции

// Сгенерировать имя для пользовательской настройки.
//
// Параметры:
//  КоллекцияЭлементов - коллекция элементов, в которую добавляется пользовательская 
//						 настройка.
//
// Возвращаемое значение:
//  Стока - сгенерированное имя пользовательской настройки.
&НаКлиенте
Функция СгенерироватьИмяПользовательскойНастройки(КоллекцияЭлементов)

	Возврат СгенерироватьИмя(2, НСтр("ru='Настройка'"), КоллекцияЭлементов, Ложь);

КонецФункции

// Сгенерировать имя для папки.
//
// Параметры:
//  КоллекцияЭлементов - коллекция элементов, в которую добавляется папка.
//
// Возвращаемое значение:
//  Стока - сгенерированное имя папки.
&НаКлиенте
Функция СгенерироватьИмяПапки(КоллекцияЭлементов)

	Возврат СгенерироватьИмя(3, НСтр("ru='Папка'"), КоллекцияЭлементов, Ложь);

КонецФункции

// Найти все уникальные имена в коллекции элементов на сервере.
//
// Параметры:
//  Элементы - коллекция элементов, имена которых нужно собрать.
//  ТипСтроки - тип строк, имена которых нужно собрать.
//  УникальныеИмена - соответствие, в которое нужно поместить уникальные имена.
//  Рекурсивно - необходимость рекурсивного получения вложенных имен.
&НаСервере
Процедура НайтиУникальныеИменаСервер(Элементы, ТипСтроки, УникальныеИмена, Рекурсивно)

	Для Каждого Элемент Из Элементы Цикл

		Если Элемент.ТипСтроки = ТипСтроки Тогда

			УникальныеИмена.Вставить(Элемент.Имя, Истина);

		КонецЕсли;

		Если Рекурсивно Тогда

			НайтиУникальныеИменаСервер(Элемент.ПолучитьЭлементы(), ТипСтроки, УникальныеИмена, Рекурсивно);

		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

// Найти все уникальные имена в коллекции элементов на клиенте.
//
// Параметры:
//  Элементы - коллекция элементов, имена которых нужно собрать.
//  ТипСтроки - тип строк, имена которых нужно собрать.
//  УникальныеИмена - соответствие, в которое нужно поместить уникальные имена.
//  Рекурсивно - необходимость рекурсивного получения вложенных имен.
&НаКлиенте
Процедура НайтиУникальныеИмена(Элементы, ТипСтроки, УникальныеИмена, Рекурсивно)

	Для Каждого Элемент Из Элементы Цикл

		Если Элемент.ТипСтроки = ТипСтроки Тогда

			УникальныеИмена.Вставить(Элемент.Имя, Истина);

		КонецЕсли;

		Если Рекурсивно Тогда

			НайтиУникальныеИмена(Элемент.ПолучитьЭлементы(), ТипСтроки, УникальныеИмена, Рекурсивно);

		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

// Определить тип папки.
//
// Параметры:
//  Элемент - элемент - папка, тип которой определяется.
//
// Возвращаемое значение:
//  Число - тип папки;
//  Неопределено в случае если тип папки определить не удалось.
&НаКлиенте
Функция ТипПапки(Элемент)

	ЭлементНеПапка = Элемент.ПолучитьРодителя();

	Пока ЭлементНеПапка <> Неопределено Цикл

		Если ЭлементНеПапка.ТипСтроки <> 3 Тогда

			Возврат ЭлементНеПапка.ТипСтроки;

		Иначе

			ЭлементНеПапка = ЭлементНеПапка.ПолучитьРодителя();

		КонецЕсли;

	КонецЦикла;

	Возврат Неопределено;

КонецФункции

// Загрузить файл.
//
// Параметры:
//  ЗагружаемоеИмяФайла - имя файла, из которого нужно загрузить. Если имя файла
//						  пустое, то нужно запросить у пользователя имя файла.
&НаКлиенте
Процедура ЗагрузитьФайлКонсоли(ЗагружаемоеИмяФайла)

	Перем Адрес;

	НачатьПодключениеРасширенияРаботыСФайлами(
		Новый ОписаниеОповещения("ЗагрузитьФайлКонсолиПослеПодключенияРасширения", ЭтаФорма,
		Новый Структура("ЗагружаемоеИмяФайла", ЗагружаемоеИмяФайла)));

КонецПроцедуры

// Обработчик подключения расширения при загрузке файла.
&НаКлиенте
Процедура ЗагрузитьФайлКонсолиПослеПодключенияРасширения(Подключено, ДополнительныеПараметры) Экспорт

	ЗагружаемоеИмяФайла = ДополнительныеПараметры.ЗагружаемоеИмяФайла;

	Если Подключено Тогда

		Если ЗагружаемоеИмяФайла = "" Тогда

			ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
			ВыборФайла.МножественныйВыбор = Ложь;
			ВыборФайла.ПолноеИмяФайла = ИмяФайла;
			Фильтр = НСтр("ru = 'Файл консоли системы компоновки данных (*.dcr)|*.dcr|Все файлы (*.*)|*.*'");
			ВыборФайла.Фильтр = Фильтр;
			ВыборФайла.Расширение = "dcr";

			НачатьПомещениеФайлов(
				Новый ОписаниеОповещения("ЗагрузитьФайлКонсолиПослеПодключенияРасширенияПослеПомещенияФайлов",
				ЭтаФорма), , ВыборФайла);

		Иначе

			ПомещаемыеФайлы = Новый Массив;
			ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ЗагружаемоеИмяФайла, ""));

			НачатьПомещениеФайлов(
				Новый ОписаниеОповещения("ЗагрузитьФайлКонсолиПослеПодключенияРасширенияПослеПомещенияФайлов",
				ЭтаФорма), ПомещаемыеФайлы, , Ложь);

		КонецЕсли;

	Иначе

		НачатьПомещениеФайла(
			Новый ОписаниеОповещения("ЗагрузитьФайлКонсолиПослеПодключенияРасширенияПослеПомещенияФайла", ЭтаФорма), ,
			ЗагружаемоеИмяФайла, , ЗагружаемоеИмяФайла = "");

	КонецЕсли;

КонецПроцедуры

// Продолжение загрузки файла после того, как выполнен выбор файла.
&НаКлиенте
Процедура ЗагрузитьФайлКонсолиПослеПодключенияРасширенияПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт

	Если ПомещенныеФайлы <> Неопределено Тогда

		ОтработкаЗагрузкиФайла(ПомещенныеФайлы);

	КонецЕсли;

КонецПроцедуры

// Продолжение загрузки файла после получения файла.
&НаКлиенте
Процедура ЗагрузитьФайлКонсолиПослеПодключенияРасширенияПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,
	ДополнительныеПараметры) Экспорт

	Если Результат Тогда

		ИмяФайла = ВыбранноеИмяФайла;
		ОтработкаЗагрузкиИзАдреса(Адрес);

	КонецЕсли;

КонецПроцедуры

// Непосредственная загузка файлов.
&НаКлиенте
Процедура ОтработкаЗагрузкиФайла(ПомещенныеФайлы)

	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл

		Если ПомещенныйФайл.Хранение <> "" Тогда
			Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.13") Тогда
				ВыбранноеИмяФайла = ПомещенныйФайл.ПолноеИмя;
			Иначе
				ВыбранноеИмяФайла = ПомещенныйФайл.Имя;
			КонецЕсли;

			Адрес = ПомещенныйФайл.Хранение;
			ИмяФайла = ВыбранноеИмяФайла;
			Прервать;

		КонецЕсли;

	КонецЦикла;

	ОтработкаЗагрузкиИзАдреса(Адрес);

КонецПроцедуры

// Отработка загрузки файла с отчетами из адреса.
&НаКлиенте
Процедура ОтработкаЗагрузкиИзАдреса(Адрес)
	Попытка
		ЗагрузитьФайлКонсолиНаСервере(Адрес);
	Исключение
		Возврат;
	КонецПопытки;
	ТекущийЭлементДерева = Неопределено;

	Если ТипЗнч(ТекущийУзел) = Тип("СписокЗначений") Тогда

		ТекущиеЭлементы = ДеревоОтчетов.ПолучитьЭлементы();

		Для Позиция = 0 По ТекущийУзел.Количество() - 1 Цикл

			Имя = ТекущийУзел[ТекущийУзел.Количество() - Позиция - 1].Значение;
			Найдено = Ложь;

			Для Каждого Элемент Из ТекущиеЭлементы Цикл

				Если Элемент.Имя = Имя Тогда

					ТекущийЭлементДерева = Элемент;
					ТекущиеЭлементы = ТекущийЭлементДерева.ПолучитьЭлементы();

					Найдено = Истина;
					Прервать;

				КонецЕсли;

			КонецЦикла;

			Если Не Найдено Тогда

				Прервать;

			КонецЕсли;

		КонецЦикла;

		Если ТекущийЭлементДерева <> Неопределено Тогда

			Элементы.ДеревоОтчетов.ТекущаяСтрока = ТекущийЭлементДерева.ПолучитьИдентификатор();

		КонецЕсли;

	КонецЕсли;

	ТекущийУзел = Неопределено;
	ОбновитьЗаголовок();
//	ТекущаяСтрока = Неопределено;
	ЗагрузитьТекущуюСтрокуНаСервере();
	НастройкиТекущейСтрокиИзменены = Ложь;
КонецПроцедуры


// Загрузить файл консоли на сервере.
//
// Параметры:
//  Адрес - адрес хранилища, из которого нужно загрузить файл.
&НаСервере
Процедура ЗагрузитьФайлКонсолиНаСервере(Адрес)

	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	Данные = ПолучитьИзВременногоХранилища(Адрес);
	Данные.Записать(ИмяВременногоФайла);
	
	ДеревоОтчетов.ПолучитьЭлементы().Очистить();
	ДеревоФайла = ЗначениеИзФайла(ИмяВременногоФайла);
	
	ПрочитатьСтрокуДереваФайлаВДеревоОтчетов(ДеревоФайла, ДеревоОтчетов);
	
	//ЗначениеВРеквизитФормы(ЗначениеИзФайла(ИмяВременногоФайла), "ДеревоОтчетов");

КонецПроцедуры

// Прочитать строку дерева файла в дерево отчетов.
// 
// Параметры:
//  СтрокаДереваФайла - ДеревоЗначений, СтрокаДереваЗначений -  Строка дерева файла
//  СтрокаДереваОтчетов - ДанныеФормыДерево, ДанныеФормыЭлементДерева -  Строка дерева отчетов
&НаСервере
Процедура ПрочитатьСтрокуДереваФайлаВДеревоОтчетов(СтрокаДереваФайла, СтрокаДереваОтчетов)
	ЭлементыДереваОтчетов = СтрокаДереваОтчетов.ПолучитьЭлементы();
	Для Каждого ТекСтр Из СтрокаДереваФайла.Строки Цикл
		НоваяСтрока = ЭлементыДереваОтчетов.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтр,,"ВнешниеНаборыДанных");
		
		Для Каждого ТекСтрокаВнешнихДанных Из ТекСтр.ВнешниеНаборыДанных Цикл
			НоваяСтрокаВнешнихНаборов = НоваяСтрока.ВнешниеНаборыДанных.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрокаВнешнихНаборов, ТекСтрокаВнешнихДанных);
		КонецЦикла;
		
		ПрочитатьСтрокуДереваФайлаВДеревоОтчетов(ТекСтр, НоваяСтрока);
	КонецЦикла;
КонецПроцедуры

// Загрузить схему компоновки данных в компоновщик настроек.
//
// Параметры:
//  ЭлементДерева - элемент дерева отчетов, схему которого нужно загрузить в компоновщик настроек.
//  ЗагружатьНастройкиПоУмолчанию - Булево. Признак того, нужно ли загружать из схемы настройки по умолчанию.
&НаСервере
Процедура ЗагрузитьСхемуКомпоновкиДанныхВКомпоновщикНастроек(ЭлементДерева, ЗагружатьНастройкиПоУмолчанию)
	
	КорневойЭлементДереваОтчетов = 4;
	Если ЭлементДерева = Неопределено 
		Или ЭлементДерева.ТипСтроки = КорневойЭлементДереваОтчетов Тогда
		Возврат;
	КонецЕсли;
	
	СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(ЭлементДерева.Данные);
	АдресВременногоХранилищаСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
		АдресВременногоХранилищаСхемы <> "", АдресВременногоХранилищаСхемы, УникальныйИдентификатор));
	Отчет.КомпоновщикНастроек.Инициализировать(
		Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресВременногоХранилищаСхемы));
	
	Если ЗагружатьНастройкиПоУмолчанию И ЗначениеЗаполнено(ЭлементДерева.НастройкиСКД) Тогда
		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.УстановитьСтроку(ЭлементДерева.НастройкиСКД);
		Настройки = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("НастройкиКомпоновкиДанных"));
		
		Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
		
	КонецЕсли;
	
КонецПроцедуры

// Загрузить настройки варианта отчета в текущую строку дерева.
//
// Параметры:
//  ЭлементДерева - элемент дерева отчета, в который нужно загрузить настройки варианта отчета.
&НаСервере
Процедура ЗагрузитьНастройкиВаниантаВТекущуюСтроку(ЭлементДерева)

	ЭлементОтчет = НайтиЭлементДереваОтчет(ЭлементДерева);

	Если ЭлементОтчет <> Неопределено Тогда

		ЗагрузитьСхемуКомпоновкиДанныхВКомпоновщикНастроек(ЭлементОтчет, Ложь);

	КонецЕсли;

	Если ЭлементДерева.Данные <> "" Тогда

		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.УстановитьСтроку(ЭлементДерева.Данные);
		Настройки = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("НастройкиКомпоновкиДанных"));

	Иначе

		Настройки = Новый НастройкиКомпоновкиДанных;

	КонецЕсли;

	Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

КонецПроцедуры

// Найти элемент дерева с отчетом.
//
// Параметры:
//  ЭлементДерева - элемент дерева, начиная от которого нужно найти элемент дерева с отчетом.
//
// Возвращаемое значение:
//   ДанныеФормыЭлементДерева - найденный элемент дерева - отчет;
//   Неопреледено - отчет не найден.
&НаСервере
Функция НайтиЭлементДереваОтчет(Знач ЭлементДерева)

	Пока ЭлементДерева <> Неопределено Цикл

		Если ЭлементДерева.ТипСтроки = 0 Тогда

			Возврат ЭлементДерева;

		Иначе

			ЭлементДерева = ЭлементДерева.ПолучитьРодителя();

		КонецЕсли;

	КонецЦикла;

	Возврат Неопределено;

КонецФункции

// Сохранить данные текущей строки на сервере.
//
// Возвращаемое значение:
//  Истина - текущая строка была изменена;
//  Ложь - текущая строка изменена не была.
&НаСервере
Функция СохранитьДанныеТекущейСтрокиНаСервере()

	Если ТекущаяСтрока <> Неопределено Тогда

		ЭлементДерева = ДеревоОтчетов.НайтиПоИдентификатору(ТекущаяСтрока);
		Если ЭлементДерева = Неопределено Тогда
			Возврат Ложь;
		КонецЕсли;

		Если ЭлементДерева.ТипСтроки = 0 Тогда

		// Вариант отчета.
			ЗаписьXML = Новый ЗаписьXML;
			ЗаписьXML.УстановитьСтроку();
			СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Отчет.КомпоновщикНастроек.Настройки, "Settings",
				"http://v8.1c.ru/8.1/data-composition-system/settings");
			НовыеДанные = ЗаписьXML.Закрыть();

			Если ЭлементДерева.НастройкиСКД <> НовыеДанные Тогда

				ЭлементДерева.НастройкиСКД = НовыеДанные;
				Возврат Истина;

			КонецЕсли;

			//		ИначеЕсли ЭлементДерева.ТипСтроки = 2 Тогда
			//			
			//			// Настройки.
			//			ЗаписьXML = Новый ЗаписьXML;
			//			ЗаписьXML.УстановитьСтроку();
			//			СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Отчет.КомпоновщикНастроек.ПользовательскиеНастройки, "UserSettings", "http://v8.1c.ru/8.1/data-composition-system/settings");
			//			НовыеДанные = ЗаписьXML.Закрыть();
			//			
			//			Если ЭлементДерева.Данные <> НовыеДанные Тогда
			//				
			//				ЭлементДерева.Данные = НовыеДанные;
			//				Возврат Истина;
			//				
			//			КонецЕсли;
			//			
		КонецЕсли;

	КонецЕсли;

	Возврат Ложь;

КонецФункции

// Загрузить текущую строку на сервере.
&НаСервере
Процедура ЗагрузитьТекущуюСтрокуНаСервере(ЗагружатьНастройкиПоУмолчанию = Истина)

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ЭлементДерева = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

	//		Если ЭлементДерева.ТипСтроки=0 Тогда
	//Схема компоновки
	ЗагрузитьСхемуКомпоновкиДанныхВКомпоновщикНастроек(ЭлементДерева, ЗагружатьНастройкиПоУмолчанию);

	//		ИначеЕсли ЭлементДерева.ТипСтроки = 1 Тогда
	//			// Вариант отчета.
	//			ЗагрузитьНастройкиВаниантаВТекущуюСтроку(ЭлементДерева);
	//			
	//		ИначеЕсли ЭлементДерева.ТипСтроки = 2 Тогда
	//			// Пользовательские настройки.
	//			ЭлементВриантИлиОтчет = ЭлементДерева.ПолучитьРодителя();
	//			
	//			Пока ЭлементВриантИлиОтчет <> Неопределено Цикл
	//				
	//				Если ЭлементВриантИлиОтчет.ТипСтроки = 0 Тогда
	//					// Нашли отчет.
	//					ЗагрузитьСхемуКомпоновкиДанныхВКомпоновщикНастроек(ЭлементВриантИлиОтчет, Истина);
	//					Прервать;
	//					
	//				ИначеЕсли ЭлементВриантИлиОтчет.ТипСтроки = 1 Тогда
	//					// Нашли вариант отчета.
	//					ЗагрузитьНастройкиВаниантаВТекущуюСтроку(ЭлементВриантИлиОтчет);
	//					Прервать;
	//					
	//				КонецЕсли;
	//				
	//				ЭлементВриантИлиОтчет = ЭлементВриантИлиОтчет.ПолучитьРодителя();
	//				
	//			КонецЦикла;
	//			
	//			Если ЭлементДерева.Данные <> "" Тогда
	//				
	//				ЧтениеXML = Новый ЧтениеXML;
	//				ЧтениеXML.УстановитьСтроку(ЭлементДерева.Данные);
	//				ПользовательскиеНастройки = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("ПользовательскиеНастройкиКомпоновкиДанных"));
	//				
	//			Иначе
	//
	//				ПользовательскиеНастройки = Новый ПользовательскиеНастройкиКомпоновкиДанных;
	//
	//			КонецЕсли;
	//			
	//			Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(ПользовательскиеНастройки);
	//			
	//		КонецЕсли;
КонецПроцедуры

// Сохранить текущую строку и загрузить новую текущую строку на сервере.
&НаСервере
Процедура СохранитьДанныеТекущейСтрокиИЗагрузитьТекущуюСтрокуНаСервере()

// Сохраним настройки текущей строки в дерево.
	СохранитьДанныеТекущейСтрокиНаСервере();

	// Загрузим настройки в компоновщик настроек.
	ЗагрузитьТекущуюСтрокуНаСервере();

КонецПроцедуры

// Вывести макет компоновки данных в табличный документ.
//
// Параметры:
//  МакетКомпоновкиДанных - макет компоновки данных, который нужно вывести.
//  ДанныеРасшифровкиОбъект - объект данных расшифровки, который нужно заполнить при выводе.
&НаСервере
Процедура ВывестиМакетКомпоновкиДанныхВТабличныйДокумент(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект)

	РезультатТабличныйДокумент.Очистить();
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, СтруктураВнешнихНаборовДанных(), ДанныеРасшифровкиОбъект, Истина);
	ПроцессорВыводаРезультатаОтчета = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВыводаРезультатаОтчета.УстановитьДокумент(РезультатТабличныйДокумент);
	ПроцессорВыводаРезультатаОтчета.НачатьВывод();
	ПроцессорВыводаРезультатаОтчета.Вывести(ПроцессорКомпоновкиДанных);
	ПроцессорВыводаРезультатаОтчета.ЗакончитьВывод();

	Если ДанныеРасшифровкиОбъект <> Неопределено Тогда

		АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиОбъект, УникальныйИдентификатор);

	КонецЕсли;

КонецПроцедуры


// Выполнить компоновку и получить текст результата компоновки данных в виде XML.
//
// Парамерты:
//  МакетКомпоновкиДанных - макет компоновки данных, который нужно выполнить.
//  ДанныеРасшифровкиОбъект - объект данных расшифровки, который нужно заполнить.
//
// Возвращаемое значение:
//   Строка - XML текст результата компоновки данных и данных расшифровки.
&НаСервере
Функция ПолучитьТекстРезультатаКомпоновкиДанных(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект)

	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, СтруктураВнешнихНаборовДанных(), ДанныеРасшифровкиОбъект, Истина);

	Результат = "<resultAndDetailsInfo>";
	Результат = Результат + Символы.ПС + Символы.Таб + "<result>";
	ЗаписьXML = Новый ЗаписьXML;
	УровеньВложенности = 3;

	Пока Истина Цикл

		ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();

		Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда

			Прервать;

		КонецЕсли;

		Если ЭлементРезультатаКомпоновкиДанных.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.Конец Тогда

			УровеньВложенности = УровеньВложенности - 1;

		КонецЕсли;

		ЗаписьXML.УстановитьСтроку();
		СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЭлементРезультатаКомпоновкиДанных, "item",
			"http://v8.1c.ru/8.1/data-composition-system/result");
		Стр = ЗаписьXML.Закрыть();

		СтрокаЗамены = "";

		Для ИИ = 1 По УровеньВложенности - 1 Цикл

			СтрокаЗамены = СтрокаЗамены + Символы.Таб;

		КонецЦикла;

		Стр = СтрЗаменить(Стр, Символы.ПС, Символы.ПС + СтрокаЗамены);
		Стр = СтрокаЗамены + Стр;
		Результат = Результат + Символы.ПС + Стр;

		Если ЭлементРезультатаКомпоновкиДанных.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.Начало Тогда

			УровеньВложенности = УровеньВложенности + 1;

		КонецЕсли;

	КонецЦикла;

	Результат = Результат + Символы.ПС + Символы.Таб + "</result>";

	Если ДанныеРасшифровкиОбъект <> Неопределено Тогда

		ЗаписьXML.УстановитьСтроку();
		СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ДанныеРасшифровкиОбъект, "detailsInfo",
			"http://v8.1c.ru/8.1/data-composition-system/details");
		Стр = ЗаписьXML.Закрыть();
		Стр = СтрЗаменить(Стр, Символы.ПС, Символы.ПС + Символы.Таб);
		Стр = Символы.Таб + Стр;
		Результат = Результат + Символы.ПС + Стр;

	КонецЕсли;

	Результат = Результат + Символы.ПС + "</resultAndDetailsInfo>";

	Возврат Результат;

КонецФункции

// Вывести макет компоновки данных в результат XML.
//
// Параметры:
//  МакетКомпоновкиДанных - макет компоновки, который нужно вывести.
//  ДанныеРасшифровкиОбъект - данные расшифровки, которые нужно заполнить.
&НаСервере
Процедура ВывестиМакетКомпоновкиДанныхВРезультатXML(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект)

	ТекстРезультатаКомпоновкиДанных = ПолучитьТекстРезультатаКомпоновкиДанных(МакетКомпоновкиДанных,
		ДанныеРасшифровкиОбъект);

КонецПроцедуры

// Вывести макет компоновки данных в результат в виде XML для коллекции значений.
//
// Параметры:
//  МакетКомпоновкиДанных - макет, который нужно вывести.
&НаСервере
Процедура ВывестиМакетКомпоновкиДанныхВРезультатXMLДляКоллекции(МакетКомпоновкиДанных)

	ТекстРезультатаКомпоновкиДанныхДляКоллекции = ПолучитьТекстРезультатаКомпоновкиДанных(МакетКомпоновкиДанных,
		Неопределено);

КонецПроцедуры

// Сформировать на сервере текущую строку в табличный документ.
//
// Возвращаемое значение:
//  Строка - текст ошибки, который нужно выдать пользователю.
&НаСервере
Функция СформироватьНаСервереВТабличныйДокумент()

	Перем ДанныеРасшифровкиОбъект;

	ЗаполненРезультатТабличныйДокумент = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда
		// Отчет.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();
			
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.Настройки, ДанныеРасшифровкиОбъект);

			Элемент.ТекстапросаИзСКД = ПолучитьЗапросИзСКД(МакетКомпоновкиДанных);
								
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
				
			ВывестиМакетКомпоновкиДанныхВТабличныйДокумент(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект);
			
			ОтобразитьПанельРезультатов();

			//		ИначеЕсли Элемент.s = 1 Тогда
			//			// Вариант отчета.
			//			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			//			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			//			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Отчет.КомпоновщикНастроек.Настройки, ДанныеРасшифровкиОбъект);
			//			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			//			ВывестиМакетКомпоновкиДанныхВТабличныйДокумент(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект);
			//			ОтобразитьПанельРезультатов();
			//			
			//		ИначеЕсли Элемент.ТипСтроки = 2 Тогда
			//			// Настройки отчета.
			//			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			//			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			//			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Отчет.КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровкиОбъект);
			//			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			//			ВывестиМакетКомпоновкиДанныхВТабличныйДокумент(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект);
			//			ОтобразитьПанельРезультатов();
		Иначе

			Возврат НСтр(
				"ru='Не понятно, какой отчет нужно формировать. Выберите отчет или вариант или настройку и повторите формирование отчета.'");

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

// Вывести дерево значений в реквизит формы.
//
// Параметры:
//  ВременноеДерево - дерево, которое нужно вывести.
&НаСервере
Процедура ВывестиДеревоРезультатВКоллекцию(ВременноеДерево)

	НовыеРеквзиты = Новый Массив;

	Для Каждого Колонка Из ВременноеДерево.Колонки Цикл
		Если Колонка.ТипЗначения.СодержитТип(Тип("ХранилищеЗначения")) Тогда
			Продолжить;
		КонецЕсли;

		НоваяКолонка = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "РезультатДерево", Колонка.Заголовок);
		НовыеРеквзиты.Добавить(НоваяКолонка);

	КонецЦикла;

	УдаляемыеРеквизиты = Новый Массив;
	ТекущиеРеквизиты = ПолучитьРеквизиты("РезультатДерево");

	Для Каждого Реквизит Из ТекущиеРеквизиты Цикл

		УдаляемыеРеквизиты.Добавить(Реквизит.Путь + "." + Реквизит.Имя);

	КонецЦикла;

	ИзменитьРеквизиты(НовыеРеквзиты, УдаляемыеРеквизиты);

	Пока Элементы.РезультатДерево.ПодчиненныеЭлементы.Количество() > 0 Цикл

		Элементы.Удалить(Элементы.РезультатДерево.ПодчиненныеЭлементы[0]);

	КонецЦикла;

	Для Каждого Колонка Из ВременноеДерево.Колонки Цикл
		Если Колонка.ТипЗначения.СодержитТип(Тип("ХранилищеЗначения")) Тогда
			Продолжить;
		КонецЕсли;

		Элемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), Элементы.РезультатДерево);
		Элемент.ПутьКДанным = "РезультатДерево." + Колонка.Имя;

	КонецЦикла;

	Элементы.ДекорацияКоллекции.Видимость = НовыеРеквзиты.Количество() = 0;

	ЗначениеВРеквизитФормы(ВременноеДерево, "РезультатДерево");

КонецПроцедуры

// Вывести макет компоновки данных в виде коллекции в реквизит формы.
//
// Параметры:
//  МакетКомпоновкиДанных - макет, который нужно вывести.
&НаСервере
Процедура ВывестиМакетКомпоновкиДанныхВКоллекцию(МакетКомпоновкиДанных)

	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, СтруктураВнешнихНаборовДанных(), , Истина);
	ПроцессорВыводаРезультатаОтчета = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВыводаРезультатаОтчета.УстановитьОбъект(Новый ДеревоЗначений);
	ПроцессорВыводаРезультатаОтчета.НачатьВывод();
	ПроцессорВыводаРезультатаОтчета.Вывести(ПроцессорКомпоновкиДанных);
	ВывестиДеревоРезультатВКоллекцию(ПроцессорВыводаРезультатаОтчета.ЗакончитьВывод());

КонецПроцедуры

// Сформировать на сервере результат и вывести его в коллекцию значений.
//
// Возвращаемое значение:
//  Строка - текст сообщения, которое нужно показать пользователю.
&НаСервере
Функция СформироватьНаСервереВКоллекцию()

	ЗаполненРезультатКоллекция = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда
		// Отчет.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			
			Элемент.ТекстапросаИзСКД = ПолучитьЗапросИзСКД(МакетКомпоновкиДанных);
				
			ВывестиМакетКомпоновкиДанныхВКоллекцию(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

			//		ИначеЕсли Элемент.ТипСтроки = 1 Тогда
			//			// Вариант отчета.
			//			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			//			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			//			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Отчет.КомпоновщикНастроек.Настройки , , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			//			ВывестиМакетКомпоновкиДанныхВКоллекцию(МакетКомпоновкиДанных);
			//			ОтобразитьПанельРезультатов();
			//			
			//		ИначеЕсли Элемент.ТипСтроки = 2 Тогда
			//			// Настройки отчета.
			//			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			//			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			//			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Отчет.КомпоновщикНастроек.ПолучитьНастройки() , , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			//			ВывестиМакетКомпоновкиДанныхВКоллекцию(МакетКомпоновкиДанных);
			//			ОтобразитьПанельРезультатов();
		Иначе

			Возврат НСтр(
				"ru='Не понятно, какой отчет нужно формировать. Выберите отчет или вариант или настройку и повторите формирование отчета.'");

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

// Сформировать на сервере отчет и вывести его в виде XML.
//
// Возвращаемое значение:
//  Строка - текст сообщения, которое нужно показать пользователю.
&НаСервере
Функция СформироватьНаСервереВВидеXML()

	Перем ДанныеРасшифровкиОбъект;

	ЗаполненРезультатXML = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда
		// Отчет.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				СхемаКомпоновкиДанных.НастройкиПоУмолчанию, ДанныеРасшифровкиОбъект);
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ВывестиМакетКомпоновкиДанныхВРезультатXML(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 1 Тогда
		// Вариант отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.Настройки, ДанныеРасшифровкиОбъект);
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ВывестиМакетКомпоновкиДанныхВРезультатXML(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 2 Тогда
		// Настройки отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровкиОбъект);
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ВывестиМакетКомпоновкиДанныхВРезультатXML(МакетКомпоновкиДанных, ДанныеРасшифровкиОбъект);
			ОтобразитьПанельРезультатов();

		Иначе

			Возврат НСтр(
				"ru='Не понятно, какой отчет нужно формировать. Выберите отчет или вариант или настройку и повторите формирование отчета.'");

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

// Сформировать результат отчета для коллекции и выдать его в виде текста XML.
//
// Возвращаемое значение:
//  Строка - текст сообщения, который нужно показать пользователю.
&НаСервере
Функция СформироватьНаСервереВВидеXMLКоллекция()

	ЗаполненРезультатКоллекцияXML = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда
		// Отчет.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				СхемаКомпоновкиДанных.НастройкиПоУмолчанию, , , Тип(
				"ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			ВывестиМакетКомпоновкиДанныхВРезультатXMLДляКоллекции(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 1 Тогда
		// Вариант отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			ВывестиМакетКомпоновкиДанныхВРезультатXMLДляКоллекции(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 2 Тогда
		// Настройки отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.ПолучитьНастройки(), , , Тип(
				"ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			ВывестиМакетКомпоновкиДанныхВРезультатXMLДляКоллекции(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		Иначе

			Возврат НСтр(
				"ru='Не понятно, какой отчет нужно формировать. Выберите отчет или вариант или настройку и повторите формирование отчета.'");

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

// Вывести макет компоновки данных в виде текста.
//
// Параметры:
//  МакетКомпоновкиДанных - выводимый макет.
//
// Возвращаемое значение:
//  Строка - текст макета компоновки данных в виде XML.
&НаСервере
Процедура ВывестиМакетКомпоновкиДанныхВТекст(МакетКомпоновкиДанных)

	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, МакетКомпоновкиДанных, "dataComposition",
		"http://v8.1c.ru/8.1/data-composition-system/composition-template");
	ТекстМакетаКомпоновкиДанных = ЗаписьXML.Закрыть();

КонецПроцедуры

// Сформировать макет компоновки данных.
// 
// Возвращаемое значение:
//  Строка - текст сообщения, который нужно выдать пользователю.
&НаСервере
Функция СформироватьНаСервереВМакетКомпоновкиДанных()

	Перем ДанныеРасшифровкиОбъект;

	ЗаполненРезультатМакет = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда
		// Отчет.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				СхемаКомпоновкиДанных.НастройкиПоУмолчанию, ДанныеРасшифровкиОбъект);
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ВывестиМакетКомпоновкиДанныхВТекст(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 1 Тогда
		// Вариант отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.Настройки, ДанныеРасшифровкиОбъект);
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ВывестиМакетКомпоновкиДанныхВТекст(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 2 Тогда
		// Настройки отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровкиОбъект);
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ВывестиМакетКомпоновкиДанныхВТекст(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		Иначе

			Возврат НСтр(
				"ru='Не понятно, какой отчет нужно формировать. Выберите отчет или вариант или настройку и повторите формирование отчета.'");

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

// Вывести макет компоновки данных для коллекции значений в виде текста.
//
// Параметры:
// МакетКомпоновкиДанных - макет компоновки данных, который нужно вывести.
&НаСервере
Процедура ВывестиМакетКомпоновкиДанныхВТекстДляКоллекции(МакетКомпоновкиДанных)

	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, МакетКомпоновкиДанных, "dataComposition",
		"http://v8.1c.ru/8.1/data-composition-system/composition-template");
	ТекстМакетаКомпоновкиДанныхДляКоллекции = ЗаписьXML.Закрыть();

КонецПроцедуры

// Сформировать макет компоновки данных для коллекции.
//
// Возвращаемое значение:
//  Строка - выводимая пользователю строка.
&НаСервере
Функция СформироватьНаСервереВМакетКомпоновкиДанныхДляКоллекции()

	Перем ДанныеРасшифровкиОбъект;

	ЗаполненРезультатМакетДляКоллекции = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда
		// Отчет.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				СхемаКомпоновкиДанных.НастройкиПоУмолчанию, , , Тип(
				"ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			ВывестиМакетКомпоновкиДанныхВТекстДляКоллекции(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 1 Тогда
		// Вариант отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			ВывестиМакетКомпоновкиДанныхВТекстДляКоллекции(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 2 Тогда
		// Настройки отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
				Отчет.КомпоновщикНастроек.ПолучитьНастройки(), , , Тип(
				"ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
			ВывестиМакетКомпоновкиДанныхВТекстДляКоллекции(МакетКомпоновкиДанных);
			ОтобразитьПанельРезультатов();

		Иначе

			Возврат НСтр(
				"ru='Не понятно, какой отчет нужно формировать. Выберите отчет или вариант или настройку и повторите формирование отчета.'");

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

// Сформировать исполняемые настройки.
//
// Возвращаемое значение:
//  Строка - сообщение, которое нужно выдать пользователю.
&НаСервере
Функция СформироватьНаСервереВИсполняемыеНастройкиКомпоновкиДанных()

	Перем ДанныеРасшифровкиОбъект;

	ЗаполненРезультатНастройки = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда
		// Отчет.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ИсполняемыйКомпоновщикНастроек.Инициализировать(
				Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыИсполненногоОтчета));
			ИсполняемыйКомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 1 Тогда

		// Вариант отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ИсполняемыйКомпоновщикНастроек.Инициализировать(
				Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыИсполненногоОтчета));
			ИсполняемыйКомпоновщикНастроек.ЗагрузитьНастройки(Отчет.КомпоновщикНастроек.Настройки);
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 2 Тогда

		// Настройки отчета.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанных(НайтиЭлементДереваОтчет(
				ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока)).Данные);
			АдресСхемыИсполненногоОтчета = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ?(
				АдресСхемыИсполненногоОтчета <> "", АдресСхемыИсполненногоОтчета, УникальныйИдентификатор));
			ИсполняемыйКомпоновщикНастроек.Инициализировать(
				Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыИсполненногоОтчета));
			ИсполняемыйКомпоновщикНастроек.ЗагрузитьНастройки(Отчет.КомпоновщикНастроек.ПолучитьНастройки());
			ОтобразитьПанельРезультатов();

		Иначе

			Возврат НСтр(
				"ru='Не понятно, какой отчет нужно формировать. Выберите отчет или вариант или настройку и повторите формирование отчета.'");

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

// Сформировать исполняемые настройки и выдать их в виде XML.
//
// Возвращаемое значение:
//  Строка - текст, выдаваемый пользователю.
&НаСервере
Функция СформироватьНаСервереВИсполняемыеНастройкиКомпоновкиДанныхXML()

	Перем ДанныеРасшифровкиОбъект;

	ЗаполненРезультатНастройкиXML = Истина;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда
		// Отчет.
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();
			ЗаписьXML = Новый ЗаписьXML;
			ЗаписьXML.УстановитьСтроку();
			СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, "Settings",
				"http://v8.1c.ru/8.1/data-composition-system/settings");
			ИсполняемыеНастройкиXML = ЗаписьXML.Закрыть();
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 1 Тогда
		// Вариант отчета.
			ЗаписьXML = Новый ЗаписьXML;
			ЗаписьXML.УстановитьСтроку();
			СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Отчет.КомпоновщикНастроек.Настройки, "Settings",
				"http://v8.1c.ru/8.1/data-composition-system/settings");
			ИсполняемыеНастройкиXML = ЗаписьXML.Закрыть();
			ОтобразитьПанельРезультатов();

		ИначеЕсли Элемент.ТипСтроки = 2 Тогда
		// Настройки отчета.
			ЗаписьXML = Новый ЗаписьXML;
			ЗаписьXML.УстановитьСтроку();
			СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Отчет.КомпоновщикНастроек.ПолучитьНастройки(), "Settings",
				"http://v8.1c.ru/8.1/data-composition-system/settings");
			ИсполняемыеНастройкиXML = ЗаписьXML.Закрыть();
			ОтобразитьПанельРезультатов();

		Иначе

			Возврат НСтр(
				"ru='Не понятно, какой отчет нужно формировать. Выберите отчет или вариант или настройку и повторите формирование отчета.'");

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

// Сформировать отчет на сервере. Формирование идет в зависимости от текущей страницы панели результатов.
//
// Возвращаемое значение:
//  Строка - текст, выдаваемый пользователю.
&НаСервере
Функция СформироватьНаСервере()

	ОтчетНужноФормировать = Истина;
	ЗаполненРезультатМакет = Ложь;
	ЗаполненРезультатНастройки = Ложь;
	ЗаполненРезультатНастройкиXML = Ложь;
	ЗаполненРезультатТабличныйДокумент = Ложь;
	ЗаполненРезультатXML = Ложь;
	ЗаполненРезультатКоллекция = Ложь;
	ЗаполненРезультатМакетДляКоллекции = Ложь;
	ЗаполненРезультатКоллекцияXML = Ложь;

	Если Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатТабличныйДокумент Тогда

		Возврат СформироватьНаСервереВТабличныйДокумент();

//	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаМакетКомпоновкиДанных Тогда
//
//		Возврат СформироватьНаСервереВМакетКомпоновкиДанных();
//
//	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаИсполняемыеНастройки Тогда
//
//		Возврат СформироватьНаСервереВИсполняемыеНастройкиКомпоновкиДанных();
//
//	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаИсполняемыеНастройкиXML Тогда
//
//		Возврат СформироватьНаСервереВИсполняемыеНастройкиКомпоновкиДанныхXML();
//
//	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКомпоновкиДанныхXML Тогда
//
//		Возврат СформироватьНаСервереВВидеXML();

	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКоллекция Тогда

		Возврат СформироватьНаСервереВКоллекцию();

//	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаМакетДляКоллекции Тогда
//
//		Возврат СформироватьНаСервереВМакетКомпоновкиДанныхДляКоллекции();
//
//	ИначеЕсли Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКоллекцияXML Тогда
//
//		Возврат СформироватьНаСервереВВидеXMLКоллекция();

	КонецЕсли;
КонецФункции

// Сформировать отчет на клиенте.
&НаКлиенте
Процедура СформироватьКлиент()

	Результат = СформироватьНаСервере();

	Если Результат <> Неопределено Тогда

		ПоказатьПредупреждение( , Результат);

	КонецЕсли;

КонецПроцедуры

// Отобразить панель результатов.
&НаСервере
Процедура ОтобразитьПанельРезультатов()

	Элементы.ПанельРезультатов.Видимость = Истина;
	Элементы.ПанельРезультатовКнопка.Пометка = Элементы.ПанельРезультатов.Видимость;

КонецПроцедуры

// Отобразить панель результатов.
&НаСервере
Процедура ОтобразитьПанельНастроек()
	ВидимостьНастроек = Не Элементы.ГруппаОтчетовИНастроек.Видимость;
	Элементы.ГруппаОтчетовИНастроек.Видимость = ВидимостьНастроек;
	Элементы.Настройки.Пометка = ВидимостьНастроек;

КонецПроцедуры

// Получить схему компоновки данных на основании текста схемы.
//
// Возвращаемое значение:
//  СхемаКомпоновкиДанных - схема, считанная из текста схемы.
&НаСервереБезКонтекста
Функция ПолучитьСхемуКомпоновкиДанных(ТекстСхемы)

	Если ТекстСхемы <> "" Тогда

		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.УстановитьСтроку(ТекстСхемы);
		Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("СхемаКомпоновкиДанных"));

	Иначе

		Возврат Новый СхемаКомпоновкиДанных;

	КонецЕсли;

КонецФункции

&НаСервере
Функция ПолучитьСхемуКомпоновкиДанныхВызовСервера()
	Возврат ПолучитьСхемуКомпоновкиДанныхСервер();
КонецФункции

// Получить схему компоновки данных для текущей строки на сервере.
//
// Возвращаемое значение:
//  СхемаКомпоновкиДанных - Схема компоновки данных для текущей строки.
&НаСервере
Функция ПолучитьСхемуКомпоновкиДанныхСервер()

	Возврат ПолучитьСхемуКомпоновкиДанных(ДеревоОтчетов.НайтиПоИдентификатору(
		Элементы.ДеревоОтчетов.ТекущаяСтрока).Данные);

КонецФункции

// Получить схему компоновки данных для текущей строки на клиенте.
//
// Возвращаемое значение:
//  СхемаКомпоновкиДанных - схема компоновка данных для текущей строки.
&НаКлиенте
Функция ПолучитьСхемуКомпоновкиДанныхКлиент()

	#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
	Возврат ПолучитьСхемуКомпоновкиДанных(ДеревоОтчетов.НайтиПоИдентификатору(
		Элементы.ДеревоОтчетов.ТекущаяСтрока).Данные);
	#Иначе
		Возврат ПолучитьСхемуКомпоновкиДанныхВызовСервера();
	#КонецЕсли

КонецФункции


// Установить схему компоновки данных для текущей строки.
//
// Параметры:
//  Схема - СхемаКомпоновкиДанных - схема, которую нужно установить текущей строке.
&НаКлиенте
Процедура УстановитьСхемуКомпоновкиДанныхКлиент(Схема, ИдентификаторСтроки = Неопределено)
	ЗагружатьНастройкиПоУмолчанию = Истина;
	
	Если Отчет.КомпоновщикНастроек.Настройки.Структура.Количество() > 0 Тогда
		
		ПоказатьВопрос(Новый ОписаниеОповещения("УстановитьСхемуКомпоновкиДанныхКлиентЗавершение", ЭтаФорма,
			Новый Структура("Схема,ИдентификаторСтроки", Схема, ИдентификаторСтроки)),
				НСтр("ru = 'Загрузить настройки по умолчанию?'"),
				РежимДиалогаВопрос.ДаНет,
				0);
		
	Иначе
		
		УстановитьСхемуКомпоновкиДанных(Схема, ЗагружатьНастройкиПоУмолчанию, ИдентификаторСтроки);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьСхемуКомпоновкиДанныхКлиентЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	ЗагружатьНастройкиПоУмолчанию = РезультатВопроса <> КодВозвратаДиалога.Нет;
	
	УстановитьСхемуКомпоновкиДанных(
		ДополнительныеПараметры.Схема, 
		ЗагружатьНастройкиПоУмолчанию, 
		ДополнительныеПараметры.ИдентификаторСтроки);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьСхемуКомпоновкиДанных(
		Знач Схема, Знач ЗагружатьНастройкиПоУмолчанию, Знач ИдентификаторСтроки = Неопределено)
	
	Если ТипЗнч(Схема) = Тип("СхемаКомпоновкиДанных") Тогда
		СхемаДляУстановки = Схема;
	ИначеЕсли ТипЗнч(Схема) = Тип("Строка") И ЭтоАдресВременногоХранилища(Схема) Тогда
		
		СхемаДляУстановки = ПолучитьИзВременногоХранилища(Схема);
		Если СхемаДляУстановки = Неопределено Тогда // Защита если хранилище уже не существует
			Возврат;
		КонецЕсли;
		
	Иначе
		Возврат;
	КонецЕсли;
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СхемаДляУстановки, "dataCompositionSchema",
		"http://v8.1c.ru/8.1/data-composition-system/schema");
	
	Если ИдентификаторСтроки = Неопределено Тогда
		ТекущаяСтрока = Элементы.ДеревоОтчетов.ТекущаяСтрока;
	Иначе
		ТекущаяСтрока = ИдентификаторСтроки;
	КонецЕсли;
	
	ТекСтрокаДерева = ДеревоОтчетов.НайтиПоИдентификатору(ТекущаяСтрока);
	Если ТекСтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекСтрокаДерева.Данные = ЗаписьXML.Закрыть();
	
	Если Не ЗначениеЗаполнено(ТекСтрокаДерева.НастройкиСКД) Или ЗагружатьНастройкиПоУмолчанию Тогда
		ЗаписьXML = Новый ЗаписьXML;
		ЗаписьXML.УстановитьСтроку();
		СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СхемаДляУстановки.НастройкиПоУмолчанию, "Settings",
			"http://v8.1c.ru/8.1/data-composition-system/settings");
		ТекСтрокаДерева.НастройкиСКД = ЗаписьXML.Закрыть();
	КонецЕсли;
	
	// Загрузим настройки в компоновщик настроек.
	ЗагрузитьТекущуюСтрокуНаСервере(ЗагружатьНастройкиПоУмолчанию);
	
КонецПроцедуры

// Открыть конструктор схемы компоновки данных.
&НаКлиенте
Процедура ОткрытьКонструкторСхемыКомпоновкиДанных()

#Если ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
	Конструктор = Новый КонструкторСхемыКомпоновкиДанных(ПолучитьСхемуКомпоновкиДанныхКлиент());
	Конструктор.Редактировать(ЭтаФорма);
#Иначе
		ТекДанные=Элементы.ДеревоОтчетов.ТекущиеДанные;
		Если ТекДанные = Неопределено Тогда
			Возврат;
		КонецЕсли;

		ПараметрыРедактора=Новый Структура;
		ПараметрыРедактора.Вставить("СКД", ТекДанные.Данные);
		ОткрытьФорму("Обработка.УИ_РедакторСКД.Форма", ПараметрыРедактора, ЭтаФорма, , , ,
			Новый ОписаниеОповещения("ОткрытьКонструкторСхемыКомпоновкиДанныхЗавершение", ЭтотОбъект,
			Новый Структура("ИдентификаторСтроки", ТекДанные.ПолучитьИдентификатор())), );
//		ПоказатьПредупреждение( , НСтр(
//			"ru='Конструктор схемы компоновки данных можно открыть только в толстом клиенте. В тонком клиенте и веб клиенте редактирование схемы компоновки данных возможно только в тексте схемы компоновки данных.'"));
#КонецЕсли

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьКонструкторСхемыКомпоновкиДанныхЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьСхемуКомпоновкиДанныхКлиент(Результат, ДополнительныеПараметры.ИдентификаторСтроки);
	
КонецПроцедуры

// Обновить заголовок формы.
&НаКлиенте
Процедура ОбновитьЗаголовок()

	Заголовок = НачальныйЗаголовок + ?(ИмяФайла <> "", ": " + ИмяФайла, "");

КонецПроцедуры

// Сохранить файл с отчетами.
//
// Параметры:
//  Как - булево. Необходимость запроса у пользователя имени файла.
//
// Возвращаемое значение:
//  Истина - сохранение прошло успешно;
//  Ложь - пользователь отменил сохранение.
&НаКлиенте
Процедура Сохранить(Как, ОбработкаОповещения)
	Перем ВыборФайла;

	НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения("СохранитьЗавершение", ЭтаФорма,
		Новый Структура("Как, ОбработкаОповещения", Как, ОбработкаОповещения)));

КонецПроцедуры

// Завершение процедуры сохранения.
&НаКлиенте
Процедура СохранитьЗавершение(Подключено, ДополнительныеПараметры) Экспорт

	Как = ДополнительныеПараметры.Как;
	ОбработкаОповещения = ДополнительныеПараметры.ОбработкаОповещения;

	Если Подключено Тогда

		Если Как Или ИмяФайла = "" Тогда
			Файл = Новый Файл(ИмяФайла);
			СохраняемоеИмяФайла = Файл.Имя;

			// Нужно запросить имя файла.
			ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
			ВыборФайла.МножественныйВыбор = Ложь;
			ВыборФайла.ПолноеИмяФайла = ИмяФайла;
			ВыборФайла.Каталог = Файл.Путь;
			Фильтр = НСтр("ru = 'Файл консоли системы компоновки данных (*.dcr)|*.dcr|Все файлы (*.*)|*.*'");
			ВыборФайла.Фильтр = Фильтр;
			ВыборФайла.Расширение = "dcr";

		Иначе
			ВыборФайла = ИмяФайла;
		КонецЕсли;

		ПолучаемыеФайлы = Новый Массив;
		ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(СохраняемоеИмяФайла,
			ПоместитьФайлВоВременноеХранилище()));
		НачатьПолучениеФайлов(Новый ОписаниеОповещения("СохранитьЗавершениеПослеПолученияФайлов", ЭтаФорма,
			Новый Структура("ОбработкаОповещения", ОбработкаОповещения)), ПолучаемыеФайлы, ВыборФайла, Ложь);

	Иначе

		ПолучитьФайл(ПоместитьФайлВоВременноеХранилище(), ИмяФайла, Истина);
		Если ОбработкаОповещения <> Неопределено Тогда

			ВыполнитьОбработкуОповещения(ОбработкаОповещения, Истина);

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Завершение сохранения после получения файлов.
&НаКлиенте
Процедура СохранитьЗавершениеПослеПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт

	ОбработкаОповещения = ДополнительныеПараметры.ОбработкаОповещения;

	Если ПолученныеФайлы = Неопределено Тогда

		Если ОбработкаОповещения <> Неопределено Тогда

			ВыполнитьОбработкуОповещения(ОбработкаОповещения, Ложь);

		КонецЕсли;
	Иначе

		ИмяФайла = ПолученныеФайлы[0].ПолноеИмя;
		ОбновитьЗаголовок();
		Если ОбработкаОповещения <> Неопределено Тогда

			ВыполнитьОбработкуОповещения(ОбработкаОповещения, Истина);

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Поместить файл во временное хранилище.
&НаСервере
Функция ПоместитьФайлВоВременноеХранилище()

	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	ЗначениеВФайл(ИмяВременногоФайла, РеквизитФормыВЗначение("ДеревоОтчетов"));
	Результат = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла));
	Возврат Результат;

КонецФункции

// Если файл отчетов был изменен, то запросить пользователя, нужно ли его сохранять.
//
// Возвращаемое значение:
//  Истина - закрытие подтверждено;
//  Ложь - пользователь отменил закрытие.
&НаКлиенте
Процедура ПодтвердитьЗакрытие(ОбработкаОповещения)

	Если СохранитьДанныеТекущейСтрокиНаСервере() Тогда

		Модифицированность = Истина;

	КонецЕсли;

	Если Модифицированность Тогда

		ПоказатьВопрос(Новый ОписаниеОповещения("ПодтвердитьЗакрытиеЗавершение", ЭтаФорма,
			Новый Структура("ОбработкаОповещения", ОбработкаОповещения)), НСтр(
			"ru='Отчеты модифицированы. Сохранить изменения?'"), РежимДиалогаВопрос.ДаНетОтмена, ,
			КодВозвратаДиалога.Да);

	Иначе

		Если ОбработкаОповещения <> Неопределено Тогда

			ВыполнитьОбработкуОповещения(ОбработкаОповещения, Истина);

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Завершение подтверждения закрытия.
&НаКлиенте
Процедура ПодтвердитьЗакрытиеЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	ОбработкаОповещения = ДополнительныеПараметры.ОбработкаОповещения;

	Ответ = РезультатВопроса;

	Если Ответ = КодВозвратаДиалога.Да Тогда

		Сохранить(Ложь, ОбработкаОповещения);

	ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда

		Если ОбработкаОповещения <> Неопределено Тогда

			ВыполнитьОбработкуОповещения(ОбработкаОповещения, Истина);

		КонецЕсли;

	Иначе

		Если ОбработкаОповещения <> Неопределено Тогда

			ВыполнитьОбработкуОповещения(ОбработкаОповещения, Ложь);

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Получить текущий узел.
//
// Возвращаемое значение:
//  Текущий узел дерева отчетов.
&НаСервере
Функция ПолучитьТекущийУзел()

	Перем Результат, ТекущийЭлементДерева;
	Результат = Новый СписокЗначений;

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		ТекущийЭлементДерева = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

	КонецЕсли;

	Пока ТекущийЭлементДерева <> Неопределено Цикл

		Результат.Добавить(ТекущийЭлементДерева.Имя);
		ТекущийЭлементДерева = ТекущийЭлементДерева.ПолучитьРодителя();

	КонецЦикла;

	Возврат Результат;

КонецФункции

// Сохранить настройки консоли в хранилище настроек.
&НаСервере
Процедура СохранитьНастройкиКонсоли()

	ХранилищеОбщихНастроек.Сохранить("НастройкиКонсолиСистемыОтчетности5", , Новый Структура("ИмяФайла,ТекущийУзел",
		ИмяФайла, ПолучитьТекущийУзел()));

КонецПроцедуры

// Выделить базовую часть имени.
//
// Параметры:
//  ПолноеИмя - Строка. Имя, из которого нужно получить базовую часть.
//
// Возвращаемое значение:
//  Строка - базовая часть имени. Получается путем отбрасывания числа, находящегося
//           в конце полного имени.
&НаСервере
Функция НайтиБазовуюЧастьИмени(ПолноеИмя)
// Ищем числа до первого пробела с конца. Обрезаем до этого пробела.
	Если СтрДлина(ПолноеИмя) < 3 Тогда

		Возврат "";

	КонецЕсли;

	Позиция = СтрДлина(ПолноеИмя);
	ЦифрыБыли = Ложь;

	Пока Позиция > 1 Цикл

		ТекущийСимвол = Сред(ПолноеИмя, Позиция, 1);

		Если ТекущийСимвол >= "0" И ТекущийСимвол <= "9" Тогда

			ЦифрыБыли = Истина;

		ИначеЕсли ТекущийСимвол = " " Тогда

			Прервать;

		Иначе

			ЦифрыБыли = Ложь;
			Прервать;

		КонецЕсли;

		Позиция = Позиция - 1;

	КонецЦикла;

	Если ЦифрыБыли И Позиция > 1 Тогда

		Возврат Сред(ПолноеИмя, 1, Позиция - 1);

	Иначе

		Возврат "";

	КонецЕсли;

КонецФункции

// Скопировать текущую строку на сервере.
&НаСервере
Процедура СкопироватьНаСервере()

	СохранитьДанныеТекущейСтрокиНаСервере();
	КопируемыйЭлемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);
	НовоеИмя = КопируемыйЭлемент.Имя;
	БазоваяЧастьИмени = "";

	//	Если КопируемыйЭлемент.ТипСтроки = 0 Тогда 
	БазоваяЧастьИмени = НайтиБазовуюЧастьИмени(КопируемыйЭлемент.Имя);

	Если БазоваяЧастьИмени = "" Тогда

		БазоваяЧастьИмени = НСтр("ru='Отчет'");

	КонецЕсли;

	НовоеИмя = СгенерироватьИмяСервер(0, БазоваяЧастьИмени, ДеревоОтчетов.ПолучитьЭлементы(), Истина);

	//	ИначеЕсли КопируемыйЭлемент.ТипСтроки = 1 Тогда 
	//		
	//		БазоваяЧастьИмени = НайтиБазовуюЧастьИмени(КопируемыйЭлемент.Имя);
	//		
	//		Если БазоваяЧастьИмени = "" Тогда
	//			
	//			БазоваяЧастьИмени = НСтр("ru='Вариант'");
	//			
	//		КонецЕсли;
	//		
	//		НовоеИмя = СгенерироватьИмяСервер(1, БазоваяЧастьИмени, КопируемыйЭлемент.ПолучитьРодителя().ПолучитьЭлементы(), Ложь)
	//		
	//	ИначеЕсли КопируемыйЭлемент.ТипСтроки = 2 Тогда
	//		
	//		БазоваяЧастьИмени = НайтиБазовуюЧастьИмени(КопируемыйЭлемент.Имя);
	//		
	//		Если БазоваяЧастьИмени = "" Тогда
	//			
	//			БазоваяЧастьИмени = НСтр("ru='Настройка'");
	//			
	//		КонецЕсли;
	//		
	//		НовоеИмя = СгенерироватьИмяСервер(2, БазоваяЧастьИмени, КопируемыйЭлемент.ПолучитьРодителя().ПолучитьЭлементы(), Ложь);
	//		
	//	ИначеЕсли КопируемыйЭлемент.ТипСтроки = 3 Тогда 
	//		
	//		БазоваяЧастьИмени = НайтиБазовуюЧастьИмени(КопируемыйЭлемент.Имя);
	//		
	//		Если БазоваяЧастьИмени = "" Тогда
	//			
	//			БазоваяЧастьИмени = НСтр("ru='Папка'");
	//			
	//		КонецЕсли;
	//		
	//		НовоеИмя = СгенерироватьИмяСервер(3, БазоваяЧастьИмени, КопируемыйЭлемент.ПолучитьРодителя().ПолучитьЭлементы(), Ложь);
	//		
	//	КонецЕсли;
	НовыйЭлемент = КопируемыйЭлемент.ПолучитьРодителя().ПолучитьЭлементы().Добавить();
	ЗаполнитьЗначенияСвойств(НовыйЭлемент, КопируемыйЭлемент);
	НовыйЭлемент.Имя = НовоеИмя;
	Элементы.ДеревоОтчетов.ТекущаяСтрока = НовыйЭлемент.ПолучитьИдентификатор();
	ЗагрузитьТекущуюСтрокуНаСервере();
	ТекущаяСтрока = НовыйЭлемент.ПолучитьИдентификатор();

КонецПроцедуры

// Выполнить на сервере отчет на основании текста макета компоновки данных.
&НаСервере
Процедура ВыполнитьНаСервереИзМакетаКомпоновкиДанных()

	ОтчетНужноФормировать = Ложь;

	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ТекстМакетаКомпоновкиДанных);
	МакетКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("МакетКомпоновкиДанных"));
	ВывестиМакетКомпоновкиДанныхВТабличныйДокумент(МакетКомпоновкиДанных, Неопределено);
	ОтобразитьПанельРезультатов();
	Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатТабличныйДокумент;

КонецПроцедуры

// Выполнить отчет в коллекцию значений на основании текста макета компоновки данных.
&НаСервере
Процедура ВыполнитьНаСервереИзМакетаКомпоновкиДанныхВКоллекцию()

	ОтчетНужноФормировать = Ложь;

	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ТекстМакетаКомпоновкиДанныхДляКоллекции);
	МакетКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("МакетКомпоновкиДанных"));
	ВывестиМакетКомпоновкиДанныхВКоллекцию(МакетКомпоновкиДанных);
	ОтобразитьПанельРезультатов();
	Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКоллекция;

КонецПроцедуры

// Выполнить отчет в виде XML на основании текста макета компоновки данных.
&НаСервере
Процедура ВыполнитьВРезультатНаСервереИзМакетаКомпоновкиДанных()

	ОтчетНужноФормировать = Ложь;

	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ТекстМакетаКомпоновкиДанных);
	МакетКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("МакетКомпоновкиДанных"));
	ВывестиМакетКомпоновкиДанныхВРезультатXML(МакетКомпоновкиДанных, Неопределено);
	ОтобразитьПанельРезультатов();
	Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКомпоновкиДанныхXML;

КонецПроцедуры

// Выполнить отчет в виде XML в коллекцию значений для макета компоновки данных.
&НаСервере
Процедура ВыполнитьВРезультатКоллекцияНаСервереИзМакетаКомпоновкиДанных()

	ОтчетНужноФормировать = Ложь;

	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ТекстМакетаКомпоновкиДанныхДляКоллекции);
	МакетКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("МакетКомпоновкиДанных"));
	ВывестиМакетКомпоновкиДанныхВРезультатXMLДляКоллекции(МакетКомпоновкиДанных);
	ОтобразитьПанельРезультатов();
	Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКоллекцияXML;

КонецПроцедуры

// Получить имя файла эталона табличного документа.
//
// Возвращаемое значение:
//  Строка - имя файла эталона табличного документа.
&НаКлиенте
Функция ИмяФайлаЭталонаТабличногоДокумента()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Эталон табличного документа.mxl'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Эталон табличного документа.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла табличного документа.
//
// Возвращаемое значение:
//  Строка - имя файла табличного документа.
&НаКлиенте
Функция ИмяФайлаТабличногоДокумента()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Табличный документ.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Табличный документ.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла эталона макета.
//
// Возвращаемое значение:
//  Строка - имя файла эталона макета
&НаКлиенте
Функция ИмяФайлаЭталонаМакета()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Эталон макета.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Эталон макета.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла макета.
//
// Возвращаемое значение
//  Строка - имя файла макета.
&НаКлиенте
Функция ИмяФайлаМакета()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Макет.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Макет.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя	файла эталона исполняемых настроек.
//
// Возвращаемое значение:
//  Строка - имя файла эталона исполняемых настроек.
&НаКлиенте
Функция ИмяФайлаЭталонаИсполняемыхНастроек()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Эталон исполняемых настроек.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Эталон исполняемых настроек.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла исполняемых настроек.
//
// Возвращаемое значение:
//  Строка - имя файла исполняемых настроек.
&НаКлиенте
Функция ИмяФайлаИсполняемыхНастроек()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Исполняемые настройки.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Исполняемые настройки.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла эталона результата XML.
// 
// Возвращаемое значение:
//  Строка - имя файла эталона результата XML.
&НаКлиенте
Функция ИмяФайлаЭталонаРезультатаXML()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Эталон результата.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Эталон результата.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла результата XML.
//
// Возвращаемое значение:
//  Строка - имя файла результата XML.
&НаКлиенте
Функция ИмяФайлаРезультатаXML()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Результат.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Результат.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла эталона макета для коллекции.
//
// Возвращаемое значение:
//  Строка - имя файла эталона макета для коллекции.
&НаКлиенте
Функция ИмяФайлаЭталонаМакетаДляКоллекции()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Эталон макета для коллекции.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Эталон макета для коллекции.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла макета для коллекции.
//
// Возвращаемое значение:
//  Строка - имя файла макета для коллекции.
&НаКлиенте
Функция ИмяФайлаМакетаДляКоллекции()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Макет для коллекции.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Макет для коллекции.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла эталона результата XML для коллекции.
//
// Возвращаемое значение:
//  Строка - имя файла эталона результата XML для коллекции.
&НаКлиенте
Функция ИмяФайлаЭталонаРезультатаXMLДляКоллекции()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Эталон результата для коллекции.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Эталон результата для коллекции.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Получить имя файла результата XML для коллекции.
//
// Возвращаемое значение:
//  Строка - имя файла результата XML для коллекции.
&НаКлиенте
Функция ИмяФайлаРезультатаXMLДляКоллекции()

	Перем ИмяФайла;

	ИмяФайла = НСтр("ru='Результат для коллекции.xml'");

	Если ИмяФайла = "" Тогда

		ИмяФайла = "Результат для коллекции.xml";

	КонецЕсли;

	Возврат КаталогВременныхФайлов() + ИмяФайла;

КонецФункции

// Вывести результат из текста результата в табличный документ.
&НаСервере
Процедура ВывестиРезультатИзТекстаРезультатаВТабличныйДокумент()

	ОтчетНужноФормировать = Ложь;
	РезультатТабличныйДокумент.Очистить();
	ПроцессорВыводаРезультатаОтчета = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВыводаРезультатаОтчета.УстановитьДокумент(РезультатТабличныйДокумент);
	ПроцессорВыводаРезультатаОтчета.НачатьВывод();

	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ТекстРезультатаКомпоновкиДанных);
	ЧтениеXML.Прочитать(); // resultAndDetailsInfo
	ЧтениеXML.Прочитать(); // result
	ЧтениеXML.Прочитать(); // item
	Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "item" Цикл

		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // item
			ЭлементРезультата = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("ЭлементРезультатаКомпоновкиДанных"));
			ПроцессорВыводаРезультатаОтчета.ВывестиЭлемент(ЭлементРезультата);

		Иначе

			Прервать;

		КонецЕсли;

	КонецЦикла;

	ПроцессорВыводаРезультатаОтчета.ЗакончитьВывод();
	ОтобразитьПанельРезультатов();
	Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатТабличныйДокумент;

КонецПроцедуры

// Вывести результат из текста результата в коллекцию.
&НаСервере
Процедура ВывестиРезультатИзТекстаРезультатаВКоллекцию()

	ОтчетНужноФормировать = Ложь;
	ПроцессорВыводаРезультатаОтчета = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВыводаРезультатаОтчета.УстановитьОбъект(Новый ДеревоЗначений);
	ПроцессорВыводаРезультатаОтчета.НачатьВывод();

	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ТекстРезультатаКомпоновкиДанныхДляКоллекции);
	ЧтениеXML.Прочитать(); // resultAndDetailsInfo
	ЧтениеXML.Прочитать(); // result
	ЧтениеXML.Прочитать(); // item
	Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "item" Цикл

		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // item
			ЭлементРезультата = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("ЭлементРезультатаКомпоновкиДанных"));
			ПроцессорВыводаРезультатаОтчета.ВывестиЭлемент(ЭлементРезультата);

		Иначе

			Прервать;

		КонецЕсли;

	КонецЦикла;

	ВывестиДеревоРезультатВКоллекцию(ПроцессорВыводаРезультатаОтчета.ЗакончитьВывод());
	ОтобразитьПанельРезультатов();
	Элементы.ПанельРезультатов.ТекущаяСтраница = Элементы.СтраницаРезультатКоллекция;

КонецПроцедуры

// Загрузить схему компоновки данных из временного хранилища в текущую строку
&НаСервере
Процедура ЗагрузитьФайлСхемыКомпоновкиДанныхНаСервере(Адрес)

	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	Данные = ПолучитьИзВременногоХранилища(Адрес);
	Данные.Записать(ИмяВременногоФайла);
	ЧтениеТекста = Новый ЧтениеТекста(ИмяВременногоФайла);
	Модифицированность = Истина;
	ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока).Данные = ЧтениеТекста.Прочитать();

КонецПроцедуры

// Загрузить схему компоновки данных из временного хранилища в текущую строку
&НаСервере
Функция ПоместитьСхемуКомпоновкиДанныхВоВременноеХранилище()

	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла);
	ЗаписьТекста.Записать(ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока).Данные);
	ЗаписьТекста.Закрыть();
	Результат = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла));
	Возврат Результат;

КонецФункции

&НаСервере
Процедура ЗаполнитьСКДДляОтладки(АдресДанныхОтладки)
	ДанныеДляОтладки = ПолучитьИзВременногоХранилища(АдресДанныхОтладки);
	ЭлементыДерева = ДеревоОтчетов.ПолучитьЭлементы();
	ЭлементыДерева.Очистить();

	КорневойЭлемент = ЭлементыДерева.Добавить();
	КорневойЭлемент.ТипСтроки = 4;
	КорневойЭлемент.Имя = НСтр("ru='Отчеты'");

	ЭлементыВКоторыеДобавляем = КорневойЭлемент.ПолучитьЭлементы();

	Имя = "Отчет для отладки";
	Элемент = ЭлементыВКоторыеДобавляем.Добавить();
	Элемент.Имя = Имя;
	Элемент.ТипСтроки = 0;

	Элемент.Данные = ДанныеДляОтладки.ТекстСКД;
	Элемент.НастройкиСКД = ДанныеДляОтладки.ТекстНастроекСКД;

	Если ДанныеДляОтладки.Свойство("ВнешниеНаборыДанных") Тогда
		Для Каждого КлючЗначение ИЗ ДанныеДляОтладки.ВнешниеНаборыДанных Цикл
			НС=Элемент.ВнешниеНаборыДанных.Добавить();
			НС.Имя=КлючЗначение.Ключ;
			НС.Значение=КлючЗначение.Значение;
			ТЗ=ЗначениеИзСтрокиВнутр(НС.Значение);
			НС.Представление=СтрШаблон("Строк: %1 Колонок: %2", ТЗ.Количество(), ТЗ.Колонки.Количество());
		КонецЦикла;
	КонецЕсли;
	
	ИмяФайла = "";

КонецПроцедуры

// Отработка выбора действия расшифровки.
&НаКлиенте
Процедура РезультатТабличныйДокументОбработкаРасшифровкиЗавершение(ВыполненноеДействие, ПараметрВыполненногоДействия,
	ДополнительныеПараметры) Экспорт

	Расшифровка = ДополнительныеПараметры.Расшифровка;

	Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет Тогда

	ИначеЕсли ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда

		ПоказатьЗначение( , ПараметрВыполненногоДействия);

	ИначеЕсли ВыполненноеДействие <> Неопределено Тогда

		ОткрытьФорму(ИмяФормыРасшифровки, Новый Структура("Расшифровка,АдресСхемыКомпоновкиДанных",
			Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(АдресДанныхРасшифровки, Расшифровка,
			ПараметрВыполненногоДействия), АдресСхемыИсполненногоОтчета), , Истина);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВнешниеНаборыДанныхПредставлениеНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат=Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекСтрокаДерева=ДеревоОтчетов.НайтиПоИдентификатору(ТекущаяСтрока);
	Если ТекСтрокаДерева=Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекДанныеСтроки=ТекСтрокаДерева.ВнешниеНаборыДанных.НайтиПоИдентификатору(ДополнительныеПараметры.ТекСтрока);
	ТекДанныеСтроки.Значение=Результат.Значение;
	ТекДанныеСтроки.Представление=Результат.Представление;
КонецПроцедуры

&НаСервере
Функция СтруктураВнешнихНаборовДанных()
	ВнешниеНаборы=Новый Структура;
	
	ТекСтрокаДерева=ДеревоОтчетов.НайтиПоИдентификатору(ТекущаяСтрока);
	Если ТекСтрокаДерева=Неопределено Тогда
		Возврат ВнешниеНаборы;
	КонецЕсли;
		
	Для Каждого Набор ИЗ ТекСтрокаДерева.ВнешниеНаборыДанных Цикл
		Если ЗначениеЗаполнено(Набор.Значение) Тогда
			Попытка
				ТЗ=ЗначениеИзСтрокиВнутр(Набор.Значение);
			Исключение
				ТЗ=Новый ТаблицаЗначений;
			КонецПопытки;
		Иначе
			ТЗ=Новый ТаблицаЗначений;
		КонецЕсли;
		ВнешниеНаборы.Вставить(Набор.Имя, ТЗ);
	КонецЦикла;
	Возврат ВнешниеНаборы;
КонецФункции

#Область ТекстыЗапросов

&НаСервере
Функция СтруктураТекстовЗапросов(НаборДанных,Запрос)
	Возврат Новый Структура("НаборДанных,Запрос", НаборДанных, Запрос);
КонецФункции

&НаСервере
Функция ПолучитьЗапросИзСКД(МакетКомпоновкиДанных)

	ТекстыЗапросов = "";
	МассивЗапросов = Новый Массив;
	
	Если ТипЗнч(МакетКомпоновкиДанных) = Тип("МакетКомпоновкиДанных") Тогда

		ПолучитьЗапросыИзНаборов(МакетКомпоновкиДанных.НаборыДанных, МассивЗапросов);

		Для Каждого ТекЗапрос Из МассивЗапросов Цикл
			ТекстыЗапросов = ТекстыЗапросов + СтрШаблон("НАБОР ДАННЫХ ""%1"": %2%3",	ТекЗапрос.НаборДанных, Символы.ПС,	ТекЗапрос.Запрос);
			
			ТекстыЗапросов = ТекстыЗапросов + Символы.ПС + Символы.ПС + "///////////////////////////////////////////////////////////"+ Символы.ПС + Символы.ПС;
		КонецЦикла;

	КонецЕсли;

	Возврат ТекстыЗапросов;

КонецФункции

&НаСервере
Функция ПолучитьМассивЗапровИзСКД(МакетКомпоновкиДанных)
	
	МассивЗапросов = Новый Массив;
	
	Если ТипЗнч(МакетКомпоновкиДанных) = Тип("МакетКомпоновкиДанных") Тогда
		ПолучитьЗапросыИзНаборов(МакетКомпоновкиДанных.НаборыДанных, МассивЗапросов);
	КонецЕсли;
	
	Возврат МассивЗапросов;
	
КонецФункции

&НаСервере
Процедура ПолучитьЗапросыИзНаборов(НаборыДанных, МассивЗапросов)

		Для Каждого НаборДанных Из НаборыДанных Цикл
			Если ТипЗнч(НаборДанных) = Тип("НаборДанныхОбъединениеМакетаКомпоновкиДанных") Тогда
				Если НаборДанных.Элементы.Количество() Тогда
					ПолучитьЗапросыИзНаборов(НаборДанных.Элементы, МассивЗапросов);
				КонецЕсли;
			КонецЕсли;
			
			Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
				ПолучитьЗапросИзНабораДанныхЗапрос(НаборДанных, МассивЗапросов);
			КонецЕсли;
		КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура ПолучитьЗапросИзНабораДанныхЗапрос(НаборДанных, МассивЗапросов)
	Если Не ПустаяСтрока(НаборДанных.Запрос) Тогда
		
		СтруктураЗапроса = СтруктураТекстовЗапросов(НаборДанных.Имя, НаборДанных.Запрос);
		
		МассивЗапросов.Добавить(СтруктураЗапроса);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПодготовитьДанныеЗапросовДляКонсоли()

	Если Элементы.ДеревоОтчетов.ТекущаяСтрока <> Неопределено Тогда

		Элемент = ДеревоОтчетов.НайтиПоИдентификатору(Элементы.ДеревоОтчетов.ТекущаяСтрока);

		Если Элемент.ТипСтроки = 0 Тогда//Отчет
		
			СхемаКомпоновкиДанных = ПолучитьСхемуКомпоновкиДанныхСервер();

			КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

			МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Отчет.КомпоновщикНастроек.Настройки);

			МассивЗапросов = ПолучитьМассивЗапровИзСКД(МакетКомпоновкиДанных);
			
			МассивЗапросовИзСКД = Новый Массив;
			ПараметрыЗапросов = Новый Структура();
			
			Для Каждого ТекПараметр Из МакетКомпоновкиДанных.ЗначенияПараметров Цикл
				ПараметрыЗапросов.Вставить(ТекПараметр.Имя, ТекПараметр.Значение);
			КонецЦикла;
			
			Для Каждого ТекЗапрос Из МассивЗапросов Цикл
				ДанныеЗапросов = Новый Структура("Имя,Текст,Параметры", ТекЗапрос.НаборДанных, ТекЗапрос.Запрос, ПараметрыЗапросов);
				МассивЗапросовИзСКД.Добавить(ДанныеЗапросов);
			КонецЦикла;
			
			АдресВХранилище = ПоместитьВоВременноеХранилище(МассивЗапросовИзСКД);
			
			Возврат АдресВХранилище;

		КонецЕсли;

	КонецЕсли;

	Возврат Неопределено
КонецФункции

#КонецОбласти


#КонецОбласти

